【发布时间】:2014-07-02 05:52:57
【问题描述】:
我有一个正则表达式函数,它将接受我的输入 $text 并返回相同的文本,但任何看起来远程像 Web 地址的内容被格式化为嵌入的 <a href></a>。
preg_replace('@(http)?(s)?(://)?(([-\w]+\.)+([^\s]+)+[^,.\s])@', '<a href="http$2://$4">$1$2$3$4</a>', $text)
示例输出:http://www.example.com => <a href="http://www.example.com">http://www.example.com</a>https://www.example.com => <a href="https://www.example.com">https://www.example.com</a>www.example.com => <a href="http://www.example.com">www.example.com</a>
现在,我想扩展它,以便当它遇到一个前面有“”的网址时,它不会这样做——我试图阻止它来自重新嵌入已经在 href="" 属性中的地址。所以,我尝试添加一个否定的回溯,如下所示:
preg_replace('@(?<!")(http)?(s)?(://)?(([-\w]+\.)+([^\s]+)+[^,.\s])@', '<a href="http$2://$4">$1$2$3$4</a>', $text)
我的理解是负面的回顾不会捕捉到任何东西。不幸的是,添加回溯不仅不会阻止引擎替换以双引号开头的地址上的模式,而且最终还会完全破坏输出。我不知道是不是操作员弄乱了回溯,或者回溯周围的括号实际上是在替换规则中抛弃了我的反向引用。再说一次——我认为他们没有贡献任何捕获的模式。
【问题讨论】:
-
先发布输入字符串,然后发布您尝试的模式。
-
因为
(http)?(s)?。这两个部分都是可选的,但它们不应该是。 -
这是我尝试过的两个输入字符串,$text=""www.example.com" 和 $text="www.example.com"。此外,这些部分怎么可能不是可选的?
http://www.example.com、https://www.example.com和www.example.com都应该被该模式捕获。 -
@user57092 你是说这个regex101.com/r/aW0sT4/1 吗?
-
哇!不错的正则表达式环境!还有一个更好的解决方案!是的,这就是我想要的行为。将其作为答案,以便我接受。
标签: php regex preg-replace regex-lookarounds