Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho um função highlight que funciona bem para destacar 1 palavra buscada. Estou tentando modificar meu code para que a função destaque todas as palavras buscadas, mas não tenho obtido sucesso. Talvez seja necessário modificar a função, e aí peço a ajuda do pessoal fera daqui.
Vamos lá. Primeiro a função:
<?php
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;
}
?>
PÁGINA DE RESULTADO
// pega URL
$colname_rsNoticia = $_GET['palavras'];
// filtra
$npalavra = explode(" ", $colname_rsNoticia);
$query_rsNoticia = "SELECT * FROM noticias WHERE 1 = 1";
$totalPalavras = count($npalavra);
for($i = 0; $i < $totalPalavras; $i++){
$query_rsNoticia .= " AND (texto LIKE '% " . $npalavra[$i] . " %' OR titulo LIKE '%" . $npalavra[$i] . "%' )";
}
$query_rsNoticia .= " ORDER BY data DESC, disposicao ASC";
$query_limit_rsNoticia = sprintf("%s LIMIT %d, %d", $query_rsNoticia, $startRow_rsNoticia, $maxRows_rsNoticia);
$rsNoticia = mysql_query($query_limit_rsNoticia, $connPMMC) or die(mysql_error());
$row_rsNoticia = mysql_fetch_assoc($rsNoticia);
// Identifica a palavra (no caso a 1ª) a ser usada para calcular a quantidade de caracteres antes e depois
$separa = explode(" ", $colname_rsNoticia);
$findme = $separa[0];
$total = count($separa);
// Encontra a posição da palavra buscada dentro do texto
$posicao = stripos($row_rsNoticia['texto'], $findme);
// Se não houver pelo menos 99 caracteres antes da palavra buscada no texto, então substr começa do 0 (zero)
if ($posicao < 100) {
// Laço para destacar as palavras da busca separadamente
for ($i = 0; $i < $total; $i++) {
// Função Highlight (palavra a ser destacada, texto onde se procura com substr, formatação)
$texto = highlight($separa[$i], substr($row_rsNoticia['texto'], 0, 210) . '...', '<font style="background-color: #B0E2FF">%s</font>');
}
}
// Se houver mais de 99 caracteres antes da palavra buscada no texto, então faz-se o cálculo do início do substr
else {
// Laço para destacar as palavras da busca separadamente
for ($i = 0; $i < $total; $i++) {
// Função Highlight (palavra a ser destacada, texto onde se procura com substr, formatação)
$texto = highlight($separa[$i], '...' . substr($row_rsNoticia['texto'], $posicao - 100, 210) . '...', '<font style="background-color: #B0E2FF">%s</font>');
}
}
// Exibe o resultado
echo $texto;
?>
PROBLEMAS A SEREM RESOLVIDOS
1. Nesta linha
$posicao = stripos($row_rsNoticia['texto'], $findme);, o stripos encontra a primeira ocorrência de uma string sem diferenciar maiúsculas e minúsculas. COMO FAÇO PARA NÃO DIFERENCIAR CARACTERES COM ACENTOS TAMBÉM?
2. Se vocês testarem, vão perceber que os laços não estão funcionando direito. Quando se busca uma string apenas, funciona corretamente. Mas quando há mais de uma string, somente a última string vem destacada (com highlight). O PROBLEMA ESTÁ NA FUNÇÃO OU NO MEU CODE?
Obrigado a todos.
Fico no aguardo!
/applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif&key=f16394cbddc7140988e95da40d87cdc04e8fd18618efd400ded17391eb1801ce" alt="Imagem Postada" />
Carregando comentários...