Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man Suchergebnisse in HTML hervorheben, ohne die Struktur zu zerstören?

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

DDD
DDDOriginal
2024-11-13 00:30:02517Durchsuche

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

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!

Stellungnahme:
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