Ignorer les balises HTML dans le remplacement des expressions régulières
Les expressions régulières sont souvent insuffisantes pour gérer des tâches d'analyse HTML complexes, en particulier lorsqu'il s'agit de cas tels que de manière sélective en ignorant les balises. Au lieu de cela, il est généralement recommandé d'utiliser DOMDocument et DOMXPath pour de tels scénarios.
Approche basée sur DOMXPath
Pour ignorer les balises HTML lors des remplacements, DOMXPath peut être utilisé pour localiser sélectivement les éléments de texte dans le document. Par exemple, la requête suivante trouverait tous les nœuds de texte contenant le terme de recherche « apple span » :
//*[contains(., "apple span")]/*[FALSE = contains(., "apple span")]/..
Création d'une classe TextRange
Ensuite, une classe TextRange
Ensuite, une requête personnalisée La classe TextRange peut être créée pour représenter une liste de nœuds de texte DOM. Cette classe permet d'effectuer des opérations sur les chaînes sur ces nœuds de texte comme s'il s'agissait d'une seule chaîne.
Traitement des résultats de la recherche
Pour chaque plage de nœuds de texte correspondante, < ;envergure> des éléments peuvent être créés et insérés autour des nœuds de texte pour les mettre en évidence. Cela générerait les résultats souhaités sans affecter les balises HTML.
Exemple
$doc = new DOMDocument; $doc->loadXML('<html><body>This is some <span>text</span> that span</body></html>'); $xp = new DOMXPath($doc); $anchor = $doc->getElementsByTagName('body')->item(0); $r = $xp->query('//*[contains(., "span")]/*[FALSE = contains(., "span")]/..', $anchor); foreach($r as $node) { $textNodes = $xp->query('.//child::text()', $node); $range = new TextRange($textNodes); while(FALSE !== $start = strpos($range, "span")) { $base = $range->split($start); $range = $base->split(strlen("span")); foreach($base->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_hightlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } } echo $doc->saveXML(); // Output the modified XML with highlighted text
Voici un exemple de code qui illustre cette approche :
Cette approche permet d'ignorer de manière robuste et efficace les balises HTML lors des opérations de remplacement, garantissant ainsi des résultats cohérents 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!