Wie kann ich HTML-Inhalte suchen und ersetzen und dabei HTML-Tags ignorieren?

Barbara Streisand
Freigeben: 2024-11-16 16:42:03
Original
951 Leute haben es durchsucht

How to Perform Search and Replace on HTML Content While Ignoring HTML Tags?

HTML-Tags in preg_replace ignorieren

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage