Question

J'ai un cas où je retourne les résultats de la base de données et de les afficher sur une page basée sur un terme de recherche. Cette partie fonctionne très bien, mais je veux hightlight ces termes de recherche en les enveloppant dans des balises span. J'ai commencé à écrire une fonction que j'ai appelé à chaque résultat qui a utilisé la fonction str_replace, mais il me est apparu que cela toucherait également tout texte qui est dans les balises HTML. Quelqu'un at-il une fonction qu'ils utilisent pour le faire efficacement? J'utilise PHP 4. Merci!

Était-ce utile?

La solution

Si vous retournez les résultats et afficher les puis vous ne devriez pas avoir accès aux données brutes avant qu'il se concocter en html? Si oui, alors faites votre modification sur les données brutes en ajoutant les balises span là-dedans.

Si vous dites que vos données brutes peuvent déjà avoir un fichier HTML en elle, vous pourriez être en mesure d'utiliser un regex pour détecter si vous êtes dans une balise html, et utiliser preg_replace au lieu de str_replace.

Autres options:

- résultats de charge dans un analyseur de dom et de ne faire remplacer les opérations sur les nœuds de texte feuille

- écrire votre propre analyseur pour garder une trace de si vous êtes à l'intérieur d'une balise html ou non

- Yank toutes les balises HTML de vos résultats, mis en caractères génériques comme "[[[Balise1]]] balha bla bla [[[tag2]]]", puis faites votre remplacer sur le reste du texte, puis remplacer vos balises de retour dans

Autres conseils

Je vais pour mettre en valeur avec javascript

http://johannburkard.de /blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

$(document).ready(function(){
$('#your_results_list').removeHighlight().highlight('search_word');
}

De cette façon vous ne plaisante pas avec la source, l'utilisateur peut se transformer point fort si vous voulez, etc.

J'ai écrit une fois une recherche en Perl, fait comme ça (fait un peu la traduction de PHP):

// Split up the full page content in pieces without `<` and `>`
preg_match_all("/([^<>]+)/", $pageContent, $matches);
foreach ($matches as $val) {
    // Just print the $val if it was between < and >
    if (preg_match("/<$val>/", $pageContent) { print "<$val>"; }
    else {
       // Do the replace
       print str_replace( "$searchString", "<span>$searchString</span>", $val);
   }
}

Vous pouvez éviter d'utiliser les expressions régulières si:

 // Split up the full page content in pieces with `<`
 $matches = split("<", $pageContent);
 foreach ($matches as $val) {
    // Just print the $val if it was between < and >
    if (stristr($pageContent, "<$val")) { print "<$val"; }
    else {
       // Do the replace
       print str_replace( "$searchString", "<span>$searchString</span>", $val);
   }
}

n'a pas testé, mais devrait être quelque chose comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top