将 URL 转换为 HTML 中的超链接,无需替换 src 属性值
我正在尝试转换 URL,但如果它们位于 src=" 之后,则不会。到目前为止,我有这个...
return preg_replace('@(?!^src=")(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
它会转换 URL,但即使它位于 src="
之前。
I'm trying to convert URLs, but not if they come after src=". So far, I have this...
return preg_replace('@(?!^src=")(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
It converts the URL, but even if it is before src="
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使其成为背后断言。
Make that a lookbehind assertion.
我必须在没有最小可验证示例的情况下推断出此任务的意图。
通过利用合法的 DOM 解析器,您可以在很大程度上防止匹配包含其他合格 URL 值的非文本节点。
下面使用 XPath 查询来防止匹配已经是
标记子级的 URL 值。仅以
text()
为目标,就无法替换标签属性值。接下来是循环文本节点时的一些巧妙的魔法。
使用
preg_match_all()
隔离每个文本节点中的一个或多个节点 URL,然后创建一个新的元素来替换相应的文本 URL 段。
使用
splitText()
“吐出”URL 之前的文本前导部分——它将成为当前节点之前的一个新节点。使用
replace_child()
将剩余文本替换为新的节点。
使用
insertBefore()
将最初跟随在 URL 文本后面的文本作为新文本节点添加到前面。代码:(演示)
输出:
I must infer the intent of this task in the absence of a minimal verifiable example.
By leveraging a legitimate DOM parser, you can largely prevent the matching of non-text nodes which contain otherwise qualifying URL values.
Below uses an XPath query to prevent matching the URL value which is already the child of an
<a>
tag. By only targetingtext()
, there is no chance of replacing tag attribute values.What comes next is some of the clever magic while looping over the text nodes.
Use
preg_match_all()
to isolate one or more nodes URLs in each text node, then create a new<a>
element to replace the respective URL segment of text.Use
splitText()
to "spit out" the leading portion of text before the URL -- it will become a new node prior to the current node.Use
replace_child()
to replace the remaining text with the new<a>
node.Use
insertBefore()
to prepend the text that originally followed the URL text as a new text node.Code: (Demo)
Output: