如何在正規表示式替換過程中有效忽略HTML標籤?

Mary-Kate Olsen
發布: 2024-11-12 06:24:02
原創
245 人瀏覽過

How to Efficiently Ignore HTML Tags During Regular Expression Replacement?

在正規表示式替換中忽略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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板