Lors de l'utilisation de preg_replace pour effectuer des opérations de recherche et de remplacement sur des chaînes contenant du HTML, il est souvent souhaitable d'ignorer les balises HTML et de modifier uniquement le contenu réel du texte. Cependant, cela peut être difficile en utilisant uniquement des expressions régulières, car elles ne sont pas bien adaptées à l'analyse HTML.
Une approche alternative consiste à utiliser DOMDocument et DOMXPath pour gérer la structure HTML. En tirant parti des requêtes XPath, il est possible de localiser les nœuds de texte dans le document HTML qui correspondent aux critères de recherche, puis d'envelopper ces nœuds avec les éléments HTML souhaités sans affecter le reste des balises HTML.
Par exemple, considérez l'extrait de code suivant qui évite les interférences de balises HTML :
$str = '...'; // HTML document $search = 'text to highlight'; $doc = new DOMDocument; $doc->loadXML($str); $xp = new DOMXPath($doc); $anchor = $doc->getElementsByTagName('body')->item(0); if (!$anchor) { throw new Exception('Anchor element not found.'); } // XPath query to locate text nodes containing the search text $r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor); if (!$r) { throw new Exception('XPath failed.'); } // Process search results foreach($r as $i => $node) { $textNodes = $xp->query('.//child::text()', $node); $range = new TextRange($textNodes); // Identify matching text node ranges $ranges = array(); while (FALSE !== $start = $range->indexOf($search)) { $base = $range->split($start); $range = $base->split(strlen($search)); $ranges[] = $base; } // Wrap matching text nodes with HTML elements foreach($ranges as $range) { foreach($range->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_highlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } } echo $doc->saveHTML();
Ce code utilise des requêtes XPath pour localiser les nœuds de texte qui contiennent le terme de recherche, puis crée une classe TextRange pour gérer les sous-plages dans les nœuds de texte. Chaque plage correspondante est ensuite enveloppée dans un élément span avec une classe personnalisée, qui peut être utilisée à des fins de mise en évidence ou à d'autres fins.
En utilisant DOMDocument et DOMXPath au lieu de s'appuyer uniquement sur des expressions régulières, cette approche offre une approche plus efficace. et un moyen fiable d'ignorer les balises HTML lors de l'exécution d'opérations de recherche et de remplacement sur du contenu 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!