首頁  >  文章  >  後端開發  >  如何在忽略HTML標籤的情況下對HTML內容進行搜尋和取代?

如何在忽略HTML標籤的情況下對HTML內容進行搜尋和取代?

Barbara Streisand
Barbara Streisand原創
2024-11-16 16:42:03952瀏覽

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

忽略preg_replace 中的HTML 標籤

當使用preg_replace 對包含HTML 的字串執行搜尋和替換操作時,通常希望忽略HTML 標籤並僅修改實際的文字內容。然而,單獨使用正規表示式可能會很困難,因為它們不太適合解析 HTML。

另一種方法是利用 DOMDocument 和 DOMXPath 來處理 HTML 結構。透過利用 XPath 查詢,可以在 HTML 文件中找到與搜尋條件相符的文字節點,然後用所需的 HTML 元素包裝這些節點,而不會影響其餘的 HTML 標記。

例如,考慮以下避免HTML 標籤幹擾的程式碼片段:

$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();

此程式碼利用XPath 查詢來定位包含搜尋字詞的文字節點,然後建立一個TextRange 類別來管理文字節點內的子範圍。然後,每個匹配範圍都包裝在帶有自訂類別的 span 元素中,該元素可用於突出顯示或其他目的。

透過使用 DOMDocument 和 DOMXPath 而不是僅依賴正規表示式,這種方法提供了更有效率的方法對 HTML 內容執行搜尋和替換操作時忽略 HTML 標籤的可靠方法。

以上是如何在忽略HTML標籤的情況下對HTML內容進行搜尋和取代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn