Wenn preg_replace zum Durchführen von Such- und Ersetzungsvorgängen für Zeichenfolgen verwendet wird, die HTML enthalten, ist es oft wünschenswert, die HTML-Tags zu ignorieren und nur zu ändern der eigentliche Textinhalt. Dies kann jedoch mit regulären Ausdrücken allein eine Herausforderung darstellen, da diese nicht gut zum Parsen von HTML geeignet sind.
Ein alternativer Ansatz besteht darin, DOMDocument und DOMXPath zur Handhabung der HTML-Struktur zu verwenden. Durch die Nutzung von XPath-Abfragen ist es möglich, Textknoten innerhalb des HTML-Dokuments zu finden, die den Suchkriterien entsprechen, und diese Knoten dann mit den gewünschten HTML-Elementen zu umschließen, ohne dass sich dies auf die übrigen HTML-Tags auswirkt.
Zum Beispiel: Betrachten Sie den folgenden Codeausschnitt, der HTML-Tag-Interferenzen vermeidet:
$str = '...'; // HTML document $search = 'text to highlight'; $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.'); } // XPath query to locate text nodes containing the search text $r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor); if (!$r) { throw new Exception('XPath failed.'); } // Process search results foreach($r as $i => $node) { $textNodes = $xp->query('.//child::text()', $node); $range = new TextRange($textNodes); // Identify matching text node ranges $ranges = array(); while (FALSE !== $start = $range->indexOf($search)) { $base = $range->split($start); $range = $base->split(strlen($search)); $ranges[] = $base; } // Wrap matching text nodes with HTML elements foreach($ranges as $range) { foreach($range->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_highlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } } echo $doc->saveHTML();
Dieser Code verwendet XPath-Abfragen, um Textknoten zu finden, die den Suchbegriff enthalten, und erstellt dann eine TextRange-Klasse um die Teilbereiche innerhalb der Textknoten zu verwalten. Jeder übereinstimmende Bereich wird dann in ein Span-Element mit einer benutzerdefinierten Klasse eingeschlossen, die zum Hervorheben oder für andere Zwecke verwendet werden kann.
Durch die Verwendung von DOMDocument und DOMXPath, anstatt sich ausschließlich auf reguläre Ausdrücke zu verlassen, bietet dieser Ansatz eine effizientere Lösung und zuverlässige Möglichkeit, HTML-Tags beim Durchführen von Such- und Ersetzungsvorgängen für HTML-Inhalte zu ignorieren.
Das obige ist der detaillierte Inhalt vonWie kann ich HTML-Inhalte suchen und ersetzen und dabei HTML-Tags ignorieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!