Maison >développement back-end >tutoriel php >Comment mettre en évidence les résultats de recherche en HTML sans casser la structure ?

Comment mettre en évidence les résultats de recherche en HTML sans casser la structure ?

DDD
DDDoriginal
2024-11-13 00:30:02614parcourir

How to Highlight Search Results in HTML Without Breaking the Structure?

Comment exclure les balises HTML dans preg_replace

Le code fourni tente de mettre en évidence les résultats de recherche dans une chaîne à l'aide de preg_replace. Cependant, la présence de balises HTML dans la chaîne pose un défi car l'opération de remplacement balise par inadvertance les balises elles-mêmes, brisant la structure HTML.

Solution : utiliser une approche basée sur DOM

Les expressions régulières ne sont pas l'outil idéal pour analyser le HTML. Pensez plutôt à utiliser le DOM (Document Object Model) et DOMXPath pour naviguer dans la structure XML de votre chaîne.

DOMXPath vous permet de rechercher des éléments contenant du texte spécifique, en ignorant les éléments XML. Cela vous permet d'isoler les nœuds de texte pertinents et de les envelopper dans les balises span souhaitées.

Implémentation du code

Le code suivant montre comment mettre en œuvre cette approche :

$doc = new DOMDocument;
$doc->loadXML($str);
$xp = new DOMXPath($doc);

// Search elements containing the search text
$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);

// Process search results
foreach($r as $i => $node)
{
    // Extract search text nodes and create suitable nodes if necessary
    $range = new TextRange($xp->query('.//child::text()', $node));
    $ranges = array();
    while(FALSE !== $start = strpos($range, $search))
    {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    };

    // Wrap matching text nodes
    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);
        }
    }
}

Ce code recherche les éléments contenant le texte recherché, en ignorant les éléments enfants qui ne le contiennent pas. Les zones de recherche sont représentées sous forme d'objets TextRange, permettant l'insertion de balises span autour du texte correspondant. Le résultat est une chaîne XML modifiée avec les résultats de recherche en surbrillance, 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