首頁  >  文章  >  後端開發  >  如何在 HTML 中反白關鍵字而忽略標籤?

如何在 HTML 中反白關鍵字而忽略標籤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-12 22:40:02916瀏覽

How to Highlight Keywords in HTML While Ignoring Tags?

如何忽略preg_replace 中的HTML 標籤

在您的程式碼片段中,您嘗試使用preg_replace 突出顯示HTML 文字中突出顯示的關鍵HTML 文字中突出顯示字。但是,當關鍵字與 HTML 標籤中的內容相符時,此方法可能會導致 HTML 結構中斷。

建議使用 XPath 和 DOMDocument 來完成此任務,而不是使用正規表示式。請考慮以下方法:

  1. 建立 DOMDocument 物件:使用 loadXML 將 HTML 文字解析為 DOMDocument 物件。
  2. 使用 DOMXPath 搜尋: 建立一個 DOMXPath 物件並使用它來查詢包含搜尋字詞的元素。
  3. 忽略搜尋中的HTML 標籤: 使用XPath 表達式,例如//*[contains(., "{$search}")]/*[FALSE = contains(., "{$search}")]/.. 辨識包含搜尋文字的父元素,同時排除HTML 標籤。
  4. 處理搜尋結果: 提取匹配的文字節點並將它們包裝在所需的 中。動態標記。
  5. 儲存修改後的 HTML: 將更新後的 DOMDocument 儲存回 HTML 字串。

程式碼範例:

$str = '...'; // HTML String
$search = 'text that span';

$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.');
}

$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);
if (!$r) {
    throw new Exception('XPath failed.');
}

foreach ($r as $i => $node) {
    $textNodes = $xp->query('.//child::text()', $node);
    $range = new TextRange($textNodes);
    while (FALSE !== $start = strpos($range, $search)) {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    }

    foreach ($ranges as $range) {
        foreach ($range->getNodes() as $node) {
            $span = $doc->createElement('span');
            $span->setAttribute('class', 'search_hightlight');
            $node = $node->parentNode->replaceChild($span, $node);
            $span->appendChild($node);
        }
    }
}

echo $doc->saveXML();

這種方法可讓您有效地反白搜尋字詞,同時忽略HTML 標籤,從而保持HTML 內容的結構完整性。

以上是如何在 HTML 中反白關鍵字而忽略標籤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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