gpt4 book ai didi

php - preg_replace() 中带有编号反向引用的负向回溯无效

转载 作者:搜寻专家 更新时间:2023-10-31 20:40:02 24 4
gpt4 key购买 nike

我有一个正则表达式函数,它将接收我的输入 $text 并返回相同的文本,但任何看起来像网页地址的东西都被格式化为嵌入式 <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)

据我所知, 负面回顾不会捕捉到任何东西。不幸的是,添加回溯不仅不会阻止引擎替换以双引号为前缀的地址模式,而且最终还会完全破坏输出。我不知道是不是?运算符搞乱了回溯,或者回溯周围的括号是否实际上抛弃了我在替换规则中的反向引用。再一次——我认为他们没有贡献任何捕获的模式。

最佳答案

我建议这个不需要任何锚定的正则表达式(因此可以在包含链接和文本的页面上使用):

<a href\s?=\s?"http(s)?://([^"]+)">([^<]+)</a>|(http)?(s)?(://)?((?:[-\w]+\.)+\S+[^,.\s])

用法:

$result = preg_replace('~<a href\s?=\s?"http(s)?://([^"]+)">([^<]+)</a>|(http)?(s)?(://)?((?:[-\w]+\.)+\S+[^,.\s])~', '<a href="http$1$5://$2$7">$3$4$5$6$7</a>', $text);

正则表达式匹配“正常”网址和已经包裹在 anchor 标记之间的网址,但在替换中以不同方式对待它们。

关于php - preg_replace() 中带有编号反向引用的负向回溯无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com