Comment effectuer une recherche et un remplacement sur du contenu HTML tout en ignorant les balises HTML ?

Barbara Streisand
Libérer: 2024-11-16 16:42:03
original
951 Les gens l'ont consulté

How to Perform Search and Replace on HTML Content While Ignoring HTML Tags?

Ignorer les balises HTML dans preg_replace

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal