Maison >développement back-end >tutoriel php >Comment ignorer efficacement les balises HTML lors du remplacement d'expressions régulières ?

Comment ignorer efficacement les balises HTML lors du remplacement d'expressions régulières ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 06:24:02294parcourir

How to Efficiently Ignore HTML Tags During Regular Expression Replacement?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn