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!