Maison >développement back-end >tutoriel php >Comment mettre en évidence les résultats de recherche en HTML sans casser la structure ?
Comment exclure les balises HTML dans preg_replace
Le code fourni tente de mettre en évidence les résultats de recherche dans une chaîne à l'aide de preg_replace. Cependant, la présence de balises HTML dans la chaîne pose un défi car l'opération de remplacement balise par inadvertance les balises elles-mêmes, brisant la structure HTML.
Solution : utiliser une approche basée sur DOM
Les expressions régulières ne sont pas l'outil idéal pour analyser le HTML. Pensez plutôt à utiliser le DOM (Document Object Model) et DOMXPath pour naviguer dans la structure XML de votre chaîne.
DOMXPath vous permet de rechercher des éléments contenant du texte spécifique, en ignorant les éléments XML. Cela vous permet d'isoler les nœuds de texte pertinents et de les envelopper dans les balises span souhaitées.
Implémentation du code
Le code suivant montre comment mettre en œuvre cette approche :
$doc = new DOMDocument; $doc->loadXML($str); $xp = new DOMXPath($doc); // Search elements containing the search text $r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor); // Process search results foreach($r as $i => $node) { // Extract search text nodes and create suitable nodes if necessary $range = new TextRange($xp->query('.//child::text()', $node)); $ranges = array(); while(FALSE !== $start = strpos($range, $search)) { $base = $range->split($start); $range = $base->split(strlen($search)); $ranges[] = $base; }; // Wrap matching text nodes foreach($ranges as $range) { foreach($range->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_hightlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } }
Ce code recherche les éléments contenant le texte recherché, en ignorant les éléments enfants qui ne le contiennent pas. Les zones de recherche sont représentées sous forme d'objets TextRange, permettant l'insertion de balises span autour du texte correspondant. Le résultat est une chaîne XML modifiée avec les résultats de recherche en surbrillance, sans casser la structure HTML.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!