我正在尝试转换 URL,但如果它们位于 src=" 之后则不会。到目前为止,我有这个...
return preg_replace('@(?!^src=")(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
它会转换 URL,但即使它是之前的
src="
。
使其成为背后断言。
(?<!^src=")
我必须在没有最小可验证示例的情况下推断出此任务的意图。
通过利用合法的 DOM 解析器,您可以在很大程度上防止匹配包含其他合格 URL 值的非文本节点。
下面使用 XPath 查询来防止匹配已经是
<a>
标签子级的 URL 值。 仅针对 text()
,无法替换标签属性值。
接下来是循环文本节点时的一些巧妙的魔法。
使用
preg_match_all()
隔离每个文本节点中的一个或多个节点 URL,然后创建一个新的 <a>
元素来替换文本的相应 URL 段。
使用
splitText()
“吐出”URL 之前的文本前导部分——它将成为当前节点之前的新节点。
使用
replace_child()
将剩余文本替换为新的 <a>
节点。
使用
insertBefore()
将最初位于 URL 文本后面的文本作为新文本节点添加到前面。