在正規表示式替換中忽略HTML 標籤
正規表示式通常不足以處理複雜的HTML 解析任務,尤其是在處理選擇性等情況時忽略標籤。相反,通常建議在這種情況下使用 DOMDocument 和 DOMXPath。
基於 DOMXPath 的方法
要在執行替換時忽略 HTML 標籤,可以使用 DOMXPath選擇性地定位文件中的文字元素。例如,以下查詢將尋找包含搜尋字詞「apple span」的所有文字節點:
//*[contains(., "apple span")]/*[FALSE = contains(., "apple span")]/..
建立TextRange 類別
然後,一個自訂可以建立TextRange類別來表示DOM 文字節點清單。此類別允許在這些文字節點上執行字串操作,就好像它們是單一字串一樣。
處理搜索結果
對於每個匹配的文本節點範圍,
處理搜索結果
;跨度>可以在文字節點周圍建立和插入元素以突出顯示它們。這將在不影響 HTML 標籤的情況下產生所需的結果。
$doc = new DOMDocument; $doc->loadXML('<html><body>This is some <span>text</span> that span</body></html>'); $xp = new DOMXPath($doc); $anchor = $doc->getElementsByTagName('body')->item(0); $r = $xp->query('//*[contains(., "span")]/*[FALSE = contains(., "span")]/..', $anchor); foreach($r as $node) { $textNodes = $xp->query('.//child::text()', $node); $range = new TextRange($textNodes); while(FALSE !== $start = strpos($range, "span")) { $base = $range->split($start); $range = $base->split(strlen("span")); foreach($base->getNodes() as $node) { $span = $doc->createElement('span'); $span->setAttribute('class', 'search_hightlight'); $node = $node->parentNode->replaceChild($span, $node); $span->appendChild($node); } } } echo $doc->saveXML(); // Output the modified XML with highlighted text
範例
以下是示範此方法的範例程式碼:此方法允許在替換操作期間穩健且有效率地忽略HTML標籤,確保結果一致,而不會破壞HTML 結構。以上是如何在正規表示式替換過程中有效忽略HTML標籤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!