2008-11-15 11 views
3

J'essaie de mettre en évidence les résultats de la recherche mais je souhaite inclure le texte environnant qui est limité par les balises englobantes.comment rechercher une sous-chaîne trouvée dans une chaîne de texte et la mettre en surbrillance

Donc, si le terme $ est « cool » le preg_replace devrait se retrouver avec:

<div><span style="background: #f00">My hair cut so cool!</span></div> 

Malheureusement, mon regex ne semble pas saisir le texte qui l'entoure, seul le terme de $. Les étiquettes environnantes peuvent être n'importe quel type d'étiquette valide.

0: 
    1: $term = 'cool'; 
    2: ob_start(); 
    3: 

    10: foreach($items as $item) { 
    11: // echoing results here 
    12: echo '<div>' . $item->text . '</div>'; 
    13: } 

    30: $content = ob_get_contents(); 
    31: ob_clean() ; 
    32: 
    33: $pattern = "/(?<!<[^>])($term)/i"; 
    34: $replace = "<span style=\"background: #f00\">$1</span>"; 
    35: echo preg_replace($pattern, $replace, $content); 
    36: 

EDIT: La boucle foreach est l'une des nombreuses et se trouve dans une classe distincte. Pour cette raison, je ne peux pas faire le remplacement dans la boucle elle-même. Il semble également plus efficace de traiter la sortie finale au lieu de chaque boucle sur les données.

Répondre

2

Trouver un terme et jusqu'à tout les balises HTML avant et après est la même que celle de trouver le terme un tous les personnages avant et après qui ne sont pas entre crochets angulaires. Ceci est trivial avec une regex:

$pattern = "/[^<>]*$term[^<>]*/i"; 
$replace = "<span style=\"background: #f00\">$0</span>"; 
+0

Excellent site web (http://www.regexguru.com). J'étudierai plus. Je vous remercie! –

-1

Pourquoi le besoin de preg_replace?

Voilà comment j'aurais résolu le problème:

Cas 1: Mettre en évidence une sous-chaîne du résultat: Utilisez strpos() ou strpos() pour obtenir l'indice de la première occurrence dans une chaîne . Next: Récupère la sous-chaîne de l'index X à l'index + L + Y, où X et Y sont des constantes définies qui décrivent le nombre de caractères à mettre en évidence avant et après le mot, et L est la longueur du mot. Appliquez ensuite -tag autour de la sous-chaîne générée.

Cas 2: Mettez en surbrillance l'étiquette de trou: Vous pouvez toujours faire la recherche par strpos/stripos. Ensuite, divisez la chaîne en deux parties: la première partie sera la sous-chaîne de zéro au pointeur, et la deuxième partie est constituée du reste de la chaîne. Puis: Rechercher le dernier occurrense (strrpos/strripos) de « > » dans la chaîne 1 et première occurense de « < » dans la chaîne 2. Insérez votre mise en valeur et profiter;)

Certaines personnes, lorsqu'ils sont confrontés à un problème , pense "Je sais, je vais utiliser des expressions régulières." Maintenant, ils ont deux problèmes - Jamie Zawinski

+0

J'aime ça. C'est plus facile à comprendre car évidemment je suis encore novice en regexing. –

+0

Je suis vraiment fatigué de la citation de JZ, en particulier dans les situations où une regex est une solution très facile. –

Questions connexes