Enviar por e-mail
Imprimir
highlight - formata as ocorrências da string pesquisada na string de entrada. É possível definir diferentes formatos para cada ocorrência, definir se a consulta será case-sensitive (caracteres maiúsculos e minúsculos são diferenciados) ou case-insensitive e descobrir o posicionamento das ocorrências. Permite também a pesquisa por truncamento de strings.
O efeito de destaque (highlight) é utilizado com freqüência em sistemas de busca. A palavra ou expressão pesquisada é destacada facilitando a visualização no contexto.
Sintaxe
highlight ( string $search, string $str, string $format [, bool $like , bool $sensitivity, array &$pos ] )Exemplos:
<?php
// Destaque simples
$string = 'Estrondo produzido por descarga de eletricidade atmosférica.';
highlight('descarga', $string, '<b>%s</b>');
// Estrondo produzido por descarga de eletricidade atmosférica.
// Alterna os formatos das ocorrências
$string = 'Chovia, chovia e chovia.';
hightlight('chovia', $string, array('<b>%s</b>', '<em>%s</em>'));
// Chovia, chovia e chovia.
// Truncamento - Formata a string aceitando truncamento de strings
$string = 'O céu ficou azulado!';
highlight('azul', $string, '<b>%s</b>', true);
// O céu ficou azulado!
// Consulta case-sensitive com truncamento
$string = 'Arma e armadura';
highlight('arma', $string, '<b>%s</b>', true, true);
// Arma e armadura
// Posições das ocorrências na string de entrada
$pos = array();
highlight('não', 'eu não sei até quando vai chover', false, false, $pos);
echo($pos); // 3
?>
Código fonte
<?php
/**
* Destaca as ocorrências de uma string.
*
* @author Alejandro Fernandez Moraga <moraga86@gmail.com>
* @link http://www.moraga.com.br
* @param string $search String pesquisada
* @param string $str String de entrada
* @param mixed $format Formato(s) da string pesquisada
* @param bool $like Define se será aceito o truncamento de strings
* @param bool $sensitivity Define se caracteres maiúsculos e minúsculos serão diferenciados
* @param array $pos Armazena as posições das ocorrências
* @return string
*/
function highlight($search, $str, $format, $like=false, $sensitivity=false, &$pos=null) {
$ret = '';
$len = strlen($str);
$s_len = strlen($search);
$_tag = false;
$_ignore = -1;
$format = (is_array($format)) ? $format : array($format);
$f_len = count($format);
$f_last = 0;
$end = array(' ', ',', '.', ';',
'(', ')','[', ']', '{', '}',
'!', '?', '<', '>', '"', '\'', '\\', '/', '|');
$f = ($sensitivity) ? 'ord' : 'strtolower';
for ($i=0; $i < $len; $i++) {
if ($i < $_ignore)
continue;
if ($str{$i} == '<' && isset($str{$i+1}) && preg_match('|[A-Z\/]|i', $str{$i+1}))
$_tag = true;
else if ($_tag && $str{$i} == '>')
$_tag = false;
if (!$_tag && $f($search{0}) == $f($str{$i}) && isset($str{$i+$s_len-1})) {
$tmp = null;
$is = true;
for ($j=0; $j < $s_len; $j++) {
if ($f($search{$j}) != $f($str{$i+$j})) {
$is = false;
break;
}
else
$tmp .= $str{$i+$j};
}
if ($is && ($like || (!isset($str{$i+$j+1}) || in_array($str{$i+$j}, $end)))) {
if (!is_null($pos))
$pos[] = $i;
$_ignore = $i + $s_len;
if ($f_last > $f_len - 1)
$f_last = 0;
$ret .= str_replace('%s', $tmp, $format[$f_last]);
$f_last++;
}
else
$ret .= $str{$i};
}
else
$ret .= $str{$i};
}
return $ret;
}
?>
Comentar
RSS
RSS