Wie kann man Suchergebnisse in HTML hervorheben, ohne die Struktur zu zerstören?

DDD
Freigeben: 2024-11-13 00:30:02
Original
536 Leute haben es durchsucht

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

So schließen Sie HTML-Tags in preg_replace aus

Der bereitgestellte Code versucht, Suchergebnisse innerhalb einer Zeichenfolge mithilfe von preg_replace hervorzuheben. Das Vorhandensein von HTML-Tags in der Zeichenfolge stellt jedoch eine Herausforderung dar, da der Ersetzungsvorgang versehentlich die Tags selbst markiert und so die HTML-Struktur zerstört.

Lösung: Verwendung eines DOM-basierten Ansatzes

Reguläre Ausdrücke sind nicht das ideale Werkzeug zum Parsen von HTML. Erwägen Sie stattdessen die Verwendung von DOM (Document Object Model) und DOMXPath, um durch die XML-Struktur Ihrer Zeichenfolge zu navigieren.

DOMXPath ermöglicht Ihnen die Suche nach Elementen, die bestimmten Text enthalten, und ignoriert dabei XML-Elemente. Dadurch können Sie die relevanten Textknoten isolieren und in die gewünschten Span-Tags einschließen.

Code-Implementierung

Der folgende Code zeigt, wie dieser Ansatz implementiert wird:

$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);
        }
    }
}
Nach dem Login kopieren

Dieser Code sucht nach Elementen, die den Suchtext enthalten, und ignoriert alle untergeordneten Elemente, die ihn nicht enthalten. Die Suchbereiche werden als TextRange-Objekte dargestellt und ermöglichen das Einfügen von Span-Tags um den übereinstimmenden Text. Das Ergebnis ist eine modifizierte XML-Zeichenfolge mit hervorgehobenen Suchergebnissen, ohne die HTML-Struktur zu zerstören.

Das obige ist der detaillierte Inhalt vonWie kann man Suchergebnisse in HTML hervorheben, ohne die Struktur zu zerstören?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage