Maison  >  Article  >  développement back-end  >  Comment mettre en évidence des mots-clés en HTML tout en ignorant les balises ?

Comment mettre en évidence des mots-clés en HTML tout en ignorant les balises ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-12 22:40:02916parcourir

How to Highlight Keywords in HTML While Ignoring Tags?

Comment ignorer les balises HTML dans preg_replace

Dans votre extrait de code, vous essayez d'utiliser preg_replace pour mettre en évidence les mots-clés recherchés dans le texte HTML. Cependant, cette approche peut entraîner une perturbation de la structure HTML lorsque le mot-clé correspond au contenu des balises HTML.

Au lieu d'utiliser des expressions régulières, il est recommandé d'exploiter XPath et DOMDocument pour cette tâche. Considérez l'approche suivante :

  1. Créez un objet DOMDocument : Analysez le texte HTML dans un objet DOMDocument à l'aide de loadXML.
  2. Utilisez DOMXPath pour la recherche : Créez un objet DOMXPath et utilisez-le pour rechercher des éléments contenant la recherche term.
  3. Ignorer les balises HTML dans la recherche : Utilisez une expression XPath comme //*[contains(., "{$search}")]/*[FALSE = contain(., "{$search}")]/.. pour identifier les éléments parents contenant le texte recherché tout en excluant les balises HTML.
  4. Traiter les résultats de la recherche : Extraire le nœuds de texte correspondants et enveloppez-les dans le balises dynamiquement.
  5. Enregistrez le code HTML modifié : Enregistrez le document DOMDocument mis à jour dans la chaîne HTML.

Exemple de code :

$str = '...'; // HTML String
$search = 'text that span';

$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.');
}

$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);
if (!$r) {
    throw new Exception('XPath failed.');
}

foreach ($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while (FALSE !== $start = strpos($range, $search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    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);
        }
    }
}

echo $doc->saveXML();

Cette approche vous permet de mettre en évidence efficacement les termes de recherche tout en ignorant les balises HTML, préservant ainsi l'intégrité structurelle de votre HTML. contenu.

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