<?php
/**
* Diversificadas funções.
*
* @author José Filipe Lopes Santos <jfilipe@med.up.pt>
* @since 27-04-2010
* @version 2.0 - data da últ. actualização: 05-01-2010
* @package tts
* @subpackage libraries
*/
/**
* Obtem os parametros para o to_date().
*
* Esta função obtem a data e formato usado na função sql to_date()
*
* @return array(mensagem de erro,data,formato)
* @param array $parts_date array com as partes da data
* @param string $predefined_format formato das datas predefinido
* @desc Obtem os parametros para o to_date().
*/
function getTo_dateParams($parts_date,$predefined_format){
// array com as partes dos formatos
$parts_formats = array("DD","MM","YYYY","HH24","MI","SS");
// formatos das datas válidos
$valid_formats = array("YYYY","YYYY-MM","MM-YYYY","DD-MM-YYYY","YYYY-MM-DD",
"DD-MM-YYYY-HH24","DD-MM-YYYY-HH24-MI","DD-MM-YYYY-HH24-MI-SS");
$date = ""; // data
$format = ""; // formato
$error_msg = ""; // mensagem em caso de erro
// apurar a data e o formato
for ($i=0;$i<sizeof($parts_date);$i++){
if ($parts_date[$i] != ""){ // só junta as partes preenchidas
$date .= "-".$parts_date[$i];
$format .= "-".$parts_formats[$i];
}
}
// tirar o 1º '-'
if ($date != "") $date = substr($date,1,strlen($date));
if ($format != "") $format = substr($format,1,strlen($format));
// se não tiver data => retorna a data e fornato vazios
if ($date == "" || strcmp($date,"--") == 0 || strcmp($date,"0000-00-00") == 0) // não tem data
return array($error_msg,"","");
// vericar se o formato da data é válido
if (!in_array($format,$valid_formats) && $format != ""){ // formato inválido
$error_msg = "O formato ".$format." da data ".$date." é incorrecto !";
return array($error_msg,$date,$format);
} else {
// se a data e formato estão vazios, o formato fica com o predefinido
if ($date == "" && $format == "")
$format = $predefined_format;
return array($error_msg,$date,$format);
}
}
/**
* Obtem os parametros para o str_to_date() em mysql.
*
* Esta função obtem a data e formato usado na função sql str_to_date() do mysql.
*
* @return array(mensagem de erro,data,formato)
* @param array $parts_date array com as partes da data
* @param string $predefined_format formato das datas predefinido
*/
function getStrToDateParams($parts_date,$predefined_format){
// array com as partes dos formatos
$parts_formats = array("%d","%m","%Y","%H","%i","%s");
// formatos das datas válidos
$valid_formats = array("%Y","%Y-%m","%m-%Y","%d-%m-%Y","%Y-%m-%d","%d-%m-%Y-%H","%d-%m-%Y-%H-%i","%d-%m-%Y-%H-%i-%s");
$date = ""; // data
$format = ""; // formato
$error_msg = ""; // mensagem em caso de erro
// apurar a data e o formato
for ($i=0;$i<sizeof($parts_date);$i++){
if ($parts_date[$i] != "" && !ereg("(^00)",$parts_date[$i])){ // só junta as partes preenchidas
$date .= "-".$parts_date[$i];
$format .= "-".$parts_formats[$i];
}
}
// tirar o 1º '-'
if ($date != "") $date = substr($date,1,strlen($date));
if ($format != "") $format = substr($format,1,strlen($format));
// se não tiver data => retorna a data e fornato vazios
if ($date == "" || strcmp($date,"--") == 0 || strcmp($date,"0000-00-00") == 0) // não tem data
return array($error_msg,"","");
// vericar se o formato da data é válido
if (!in_array($format,$valid_formats) && $format != ""){ // formato inválido
$error_msg = "O formato ".$format." da data ".$date." é incorrecto !";
return array($error_msg,$date,$format);
} else {
// se a data e formato estão vazios, o formato fica com o predefinido
if ($date == "" && $format == "")
$format = $predefined_format;
return array($error_msg,$date,$format);
}
}
/**
* Verifica se a data é válida.
*
* Esta função verifica se a data é válida.
*
* @param string $date data em causa
* @param string $delim delimitador
* @return true - se a data é válida ou se existem campos vazios, false - caso contrário
*/
function isValidDate($date,$delim="-"){
$date_parts = array();
$valid = false;
// obter as partes da data
$date_parts = explode($delim,$date);
// verificar se todas as partes estão preenchidas
foreach ($date_parts as $date_part){ // para cada parte da data
if ($date_part == "") // parte vazia
return true;
}
// se não tiver 3 partes (dia, mês e ano), retorna true
if (count($date_parts) < 3)
return true;
// verificar se a data é válida
$valid = checkdate($date_parts[1],$date_parts[0],$date_parts[2]);
return $valid;
}
/**
* Obtem o timestamp dessa data.
*
* Esta função obtem o timestamp de uma dada data.
*
* @return integer timestamp da respectiva data
* @param string $date data em causa
* @param string[optional] $delim delimitador
*/
function getTimestamp($date,$delim="-"){
$date_parts = array();
// canalizar as datas para as variáveis, consoante o nº de partes da data
$date_parts = explode($delim,$date);
// verificar se existem partes da data vazias
for ($i=0;$i<6;$i++)
// inicializar com zero
if (empty($date_parts[$i])) $date_parts[$i]=0;
return mktime($date_parts[3],$date_parts[4],$date_parts[5],$date_parts[1],$date_parts[0],$date_parts[2]);
}
/**
* Normalizar campos e strings.
*
* Esta função normaliza campos e strings com ou sem acentos, isto é,
* converte caracteres especiais na string em caracteres normalizados e,
* converte a string resultante para minúsculas
*
* @return string condição de pesquisa normalizada
* @param string $campo campo a normalizar ou não
* @param string $string string a normalizar
* @param bool $esta_normalizado booleano que indica se o campo já está normalizado
* @param string $tipo_comparacao tipo de comparação
* @param bool[optional] $exact_phrase booleano que indica se quer pesquisar pela frase exacta ou não
* @desc Normalizar campos e strings.
*/
function getWhereNormalized($campo,$string,$esta_normalizado,$tipo_comparacao,$exact_phrase = true){
$caracteres_especiais = "áéíõùâêîòúãçóûÀÈÌÁÉÕÙÂÊÎÒÚÃÇÓÛ"; // caracteres com acentos
$caracteres_norm = "aeiouaeiouacouAEIAEOUAEIOUACOU"; // resp. normalização
if ($esta_normalizado) // o campo já está normalizado
$campo_normalizado = $campo;
else
// normaliza o campo
$campo_normalizado = "upper(translate(".$campo.",'".$caracteres_especiais."','".$caracteres_norm."'))";
// detectar o prefixo do like
$pref_like = "";
if (strncasecmp($string,"+",1) == 0 && strlen($string) > 1) $pref_like = "";
if (strncasecmp($string,"-",1) == 0 && strlen($string) > 1) $pref_like = "not";
else $pref_like = "";
if ((strncasecmp($string,"+",1) == 0 || strncasecmp($string,"-",1) == 0) && strlen($string) > 1) // tem caracteres de comparação no início da string
$string = substr($string,1,strlen($string)); // retirar esses caracteres
// normalizar a string
$string_normalizada = normaliza_string($string);
// se não se quiser pesquisar pela frase, tal e qual como está (exacta),
// pesquisa-se pelos registos que contenham todas essas palavras pela mesma ordem
if (!$exact_phrase){
// se fôr do gênero "a b"
if (eregi("[a-z0-9]+[[:space:]][a-z0-9]+",$string_normalizada))
// substitui espaços por '%', para pesquisar tb nos intervalos (ex: "a%b%c")
$string_normalizada = ereg_replace("[[:space:]]","%",$string_normalizada);
}
// retornar a condição de pesquisa, consoante o tipo
if (strcmp($tipo_comparacao,"%like%") == 0) // tipo de comparação 'like' por qualquer string
return $campo_normalizado." ".$pref_like." like '%".$string_normalizada."%'";
elseif (strcmp($tipo_comparacao,"like%") == 0) // tipo de comparação 'like' só no início da string
return $campo_normalizado." ".$pref_like." like '".$string_normalizada."%'";
elseif (strcmp($tipo_comparacao,"=") == 0) // tipe de comparação '='
return $campo_normalizado." = '".$string_normalizada."'";
}
/**
* Normaliza strings.
*
* Esta função normaliza strings
*
* @return string $string_norm string normalizada
* @param string $string string a normalizar
* @param bool $trim=true booleano que indica se é para retirar espaços em branco
* @desc Normaliza strings.
*/
function normaliza_string($string,$trim = true){
$string_norm = "";
$caracteres_especiais = "áéíõùàâêîòúãçóûÀÈÌÁÉÕÙÂÊÎÒÚÃÇÓÛ"; // caracteres com acentos
$caracteres_norm = "aeiouaaeiouacouAEIAEOUAEIOUACOU"; // resp. normalização
// tirar espaços em branco, se fôr caso disso
if ($trim)
$string = trim($string);
// substituir os caracteres acentuados, pelos mesmos sem acento
$string_norm = strtr($string,$caracteres_especiais,$caracteres_norm);
// substituir qualquer outro caracter que não seja letras e nº's por espaços
if (!eregi("^([a-z0-9]+)$",$string_norm)) // existem caracteres especiais
$string_norm = ereg_replace("[^a-zA-Z0-9]"," ",$string_norm);
// converter para maisculas
$string_norm = strtoupper($string_norm);
return $string_norm;
}
/**
* Substitui a última "," da mensagem por "e", excepto a do fim da mensagem.
*
* Esta função substitui a última "," da mensagem por "e", excepto a do fim da mensagem,
* para que essa mensagem faça sentido e, esteja ortográficamente correcta
*
* @param string $msg mensagem em caso de erro, apurada nas condições de pesquisa
* @param integer $nresultados nº de resultados obtidos
* @return string $frase frase completa dado o nº de resultados
* @desc Substitui a última "," da mensagem por "e", excepto a do fim da mensagem
*/
function MensagemCorrecta($msg,$nresultados){
$msg = substr($msg,0,strrpos($msg,",")); // tirar últ. vírgula
$msg1 = substr($msg,0,strrpos($msg,",")); // string até à últ. vírgula
$msg2 = substr($msg,strrpos($msg,","),strlen($msg)); // o resto da string
$msg2 = ereg_replace(","," e",$msg2); // sustituir a últ vírgula por "e"
$msg_final = $msg1.$msg2; // juntar as strings
// obter a frase correcta consoante o nº de resultados
if ($nresultados == 0){ // não existem resultados
if ($msg_final != "")
$frase = "Não foram encontrados resultados com ".$msg_final;
else
$frase = "Não foram encontrados resultados";
} else if ($nresultados > 0) // existem resultados
$frase = "Foram encontrados $nresultados resultados com ".$msg_final;
else if ($nresultados == -1){ // mensagem de erro: campos não numéricos
if (strpos($msg_final," e ") != "") // + que 1 campo
$frase = $msg_final." têm que ser numéricos";
else // só um campo
$frase = $msg_final." tem que ser numérico";
$frase = strtoupper(substr($frase,0,1)).substr($frase,1,strlen($frase));
}
return $frase;
}
/**
* Obtem o nome do campo normalizado.
*
* Esta função pega num campo de um select e, obtem o campo correspondente em minúsculas
* sem as funções sql to_char() e to_date().
*
* @return string $field campo normalizado
* @param string $field campo a normalizar
*/
function getNormalizedFieldName($field){
// é campo to_char(field,'format')
if (strpos($field,",") != ""){
// tirar to_char(, e só fica field,'format'
$field = substr($field,strpos($field,"(")+1,strlen($field));
// tirar ,'format' a field,'format' e temos o campo pretendido
$field = substr($field,0,strpos($field,","));
}
// converter para minúsculas
$field = strtolower($field);
return $field;
}
/**
* Destaca as palavras encontradas.
*
* Esta função, do texto indicado, destaca as palavras
* que coincidem com as palavras de pesquisa.
*
* @param string $text texto em causa
* @param string $str_search_words string com as palavras de pesquisa
* @param string $tag_open tag de início da palavra a destacar
* @param string $tag_close tag de fim da palavra a destacar
* @return string texto com as palavras destacadas
*/
function HighlightText($text,$str_search_words,$tag_open,$tag_close){
$highlight_text = "";
// se não estiverem indicadas palavras de pesquisa, retorna o texto como estava
if (trim($str_search_words) == "") return $text;
// obter as palavras de pesquisa
$search_words = explode(" ",trim($str_search_words));
// texto normalizado
$text_norm = normaliza_string($text);
foreach ($search_words as $word){ // para cada palavra de pesquisa
// obter a palavra de pesquisa normalizada
$word_norm = normaliza_string($word);
if (ereg($word_norm,$text_norm)){ // essa palavra ocorre no texto
// se essa palavra não ocorre no texto, salta à frente
if (!ereg($word_norm,normaliza_string($text,false))) continue;
// determinar as posiçóes de início e de fim da palavra a destacar
$pos_ini = strpos(normaliza_string($text,false),$word_norm);
$len = strlen($word_norm);
$pos_fim = $pos_ini + $len - 1;
// se tiver um caracter especial, avança uma posição à frente
if (normaliza_string($text[$pos_ini]) == " "){
$pos_ini++;
$pos_fim++;
}
// determinar as partes do texto: texto antes, palavra destacada, texto depois
$text_before = substr($text,0,$pos_ini);
$word_text = substr($text,$pos_ini,$len);
$text = substr($text,$pos_fim+1,strlen($text));
// refazer o texto com a palavra destacada
$highlight_text .= $text_before.$tag_open.$word_text.$tag_close;
}
}
if ($text != "") // ainda não terminou o texto
$highlight_text .= $text; // junta o resto do texto
return $highlight_text;
}
/**
* Obtem uma string a partir dos dados.
*
* Esta função, obtem uma string a partir dos dados.
*
* @param array $data dados em causa
* @param array $fields array com os campos pretendidos e respectivos separadores
* @param string[optional] $global_sep separador global
* @return string $str string resultante
*/
function getDataString($data,$fields,$global_sep = ";"){
$str = "";
foreach ($data as $index=>$info){ // para cada item
// juntar o separador global
$str .= $global_sep;
$n = 0;
foreach ($fields as $field=>$sep){ // para cada campo
if (!empty($info[$field])){ // existem dados para esse campo
// juntar esse dado
$str .= $info[$field];
if ($n < sizeof($fields) -1) // não é o último campo
// juntar o separador desse campo
$str .= $sep;
}
$n++;
}
}
// retirar o 1º separador global
if ($str != "")
$str = substr($str,1,strlen($str));
return $str;
}
/**
* Retira os espaços em branco em excesso.
*
* Esta função retira os espaços em branco em excesso,
* cortando todos os espaços em branco no início e no fim da string,
* deixando apenas um espaço entre as palavras.
*
* @return string string sem espaços em branco em excesso
* @param string $string string possívelmente com espaços em branco em excesso
*/
function StripWhiteSpaces($string){
$parts2 = array();
$nparts2 = 0;
$parts = explode(" ",trim($string));
foreach ($parts as $part){ // para cada parte
if (trim($part) != "") // só se aproveitam as partes não vazias
$parts2[$nparts2++] = $part;
}
return implode(" ",$parts2);
}
/**
* Limita a string.
*
* Esta função limita uma dada string, dado o nº máximo de caracteres da string.
*
* @param string $string string em causa
* @param integer $max nº máximo de caracteres
* @return string $string_limited string limitada
*/
function LimitString($string,$max){
$string_limited = "";
$more = " ..."; // string que indica que o nome é demasiado grande
$limit = $max - strlen($more); // tamanho a partir do qual corta a string
if (strlen($string) <= $max) // não ultrapassa o limite
$string_limited = $string; // fica igual
else
// cortar a string
$string_limited = substr($string,0,$limit).$more;
return $string_limited;
}
?> |