2010-03-11 10 views
1

Je travaille sur un simple moteur de recherche pour une application de journal. Lorsque l'utilisateur tape un mot-clé, une page de résultats s'affiche, mettant en évidence le terme avec une couleur.PHP: Mise en surbrillance des mots à la recherche

que je fais actuellement ceci:

$title = str_ireplace($term, "<span class='highlight'>$term</span>", $note->Title); 

Grande, str_ireplace() fait la recherche insensible à la casse, mais lorsque le cas ne correspond pas à la note (l'utilisateur cherche « l'argent » et la note dit "argent"), cela se produit:

 
malvinas | Resultados de la búsqueda 

    1. malvinas: Argentina va a la ONU y Londres se enfurece » en Actualidad 
     [...] Naciones Unidas, Ban-Ki Moon, ante quien reiterará que se cumplan las 
resoluciones de la ONU sobre el tema de la soberanía de las Islas [...] 

le titre original de la note est "Malvinas: l'Argentine va a la y Londres se ONU enfurece" (et non "Malvinas", etc.)

Comment puis-je faire une surbrillance sans modifier le CaSe du mot d'origine?

Répondre

2

Utilisation regex:

$term = 'hello'; 
$str = 'Hello there'; 
$term_escaped = preg_quote($term); 
$out = preg_replace("~$term_escaped~i", '<b>\0</b>', $str); 

echo $out; 

Sortie:

<b>Hello</b> there 
+0

Cela a parfaitement fonctionné. Merci beaucoup! –

1

Vous devez utiliser backreferences, avec un modificateur insensible à la casse. De cette façon, lorsque vous remplacez le mot, vous le remplacez par lui-même (en conservant son cas) et ne le remplacez pas par n'importe quel boîtier utilisé lors de la recherche.

L'utilisation de cette méthode avec preg_replace vous permet de transmettre un tableau de termes de recherche et un modèle générique de remplacement pour chacun d'entre eux.