首頁  >  文章  >  後端開發  >  如何在不破壞結構的情況下突出顯示 HTML 中的搜尋結果?

如何在不破壞結構的情況下突出顯示 HTML 中的搜尋結果?

DDD
DDD原創
2024-11-13 00:30:02541瀏覽

How to Highlight Search Results in HTML Without Breaking the Structure?

如何在 preg_replace 中排除 HTML 標籤

提供的程式碼嘗試使用 preg_replace 來反白字串中的搜尋結果。然而,字串中 HTML 標籤的存在帶來了挑戰,因為替換操作無意中標記了標籤本身,從而破壞了 HTML 結構。

解決方案:採用基於 DOM 的方法

正規表示式並不是解析 HTML 的理想工具。相反,請考慮使用 DOM(文檔物件模型)和 DOMXPath 來導覽字串的 XML 結構。

DOMXPath 可讓您搜尋包含特定文字的元素,而忽略 XML 元素。這允許您隔離相關的文字節點並將它們包裝在所需的跨度標籤中。

程式碼實作

以下程式碼示範如何實作此方法:

$doc = new DOMDocument;
$doc->loadXML($str);
$xp = new DOMXPath($doc);

// Search elements containing the search text
$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);

// Process search results
foreach($r as $i => $node)
{
    // Extract search text nodes and create suitable nodes if necessary
    $range = new TextRange($xp->query('.//child::text()', $node));
    $ranges = array();
    while(FALSE !== $start = strpos($range, $search))
    {
        $base = $range->split($start);
        $range = $base->split(strlen($search));
        $ranges[] = $base;
    };

    // Wrap matching text nodes
    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);
        }
    }
}

此程式碼搜尋包含搜尋文字的元素,忽略不包含它的任何子元素。搜尋區域表示為 TextRange 對象,允許在匹配文字周圍插入跨度標籤。結果是修改後的 XML 字串,其中突出顯示搜尋結果,而不會破壞 HTML 結構。

以上是如何在不破壞結構的情況下突出顯示 HTML 中的搜尋結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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