当使用 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中文网其他相关文章!