从文本 URL 检测和替换中排除 HTML 标记
在您寻求将纯文本 URL 转换为 HTML 锚标记时,不包括 HTML 中的锚标记标签,您当前的正则表达式遇到了障碍。本文旨在为这一挑战提供全面的解决方案。
您当前的正则表达式方法可以有效地检测和替换文本中的 URL,但它也会错误地定位 HTML 标记中的 URL。为了纠正这个问题,我们必须采用更有针对性的方法。
使用 XPath 识别符合条件的 URL
我们可以利用 XPath 来精确选择,而不是广泛的文本搜索包含不是锚元素后代的 URL 的文本节点。这可以确保 HTML 标签内的 URL 不受影响。
$xPath = new DOMXPath($dom); $texts = $xPath->query('/html/body//text()[not(ancestor::a) and (contains(., "http://") or contains(., "https://") or contains(., "ftp://"))]');
用文档片段替换文本节点
我们将使用文档而不是直接修改文本节点片段以将整个文本节点替换为所需的 HTML。这种非标准技术简化了流程。
foreach ($texts as $text) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML( preg_replace("~((?:http|https|ftp)://(?:\S*?\.\S*?))(?=\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)~i", '<a href=""></a>', $text->data) ); $text->parentNode->replaceChild($fragment, $text); }
输出
这种方法有效地将纯文本中符合条件的 URL 转换为 HTML 锚标记,同时排除 HTML 中的 URL标签。生成的 HTML 将反映所需的转换,而不会进行任何不需要的修改。
以上是如何从文本 URL 检测和替换中排除 HTML 标签?的详细内容。更多信息请关注PHP中文网其他相关文章!