當使用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中文網其他相關文章!