正则表达式没有在特殊字符处获得整个链接
Posted
技术标签:
【中文标题】正则表达式没有在特殊字符处获得整个链接【英文标题】:Regex not getting whole link at special characters 【发布时间】:2013-07-25 17:31:15 【问题描述】:我正在使用此代码:
$string = preg_replace("~(?!(?:https?://(?:www\.)?|www\.)(?:youtube\.com)(?:https?://(?:www\.)?|www\.)[\w./=?#-]+~i", '<a href="$0">$0</a>', $string);
这样我就可以把下面的链接变成可点击的链接了。
http://upload.wikimedia.org/wikipedia/commons/f/f2/Bill_Clinton%2C_Yitzhak_Rabin,%2C_Yasser_Arafat_at_the_White_House_1993-09-13.jpg
这适用于部分...它创建http://upload.wikimedia.org/wikipedia/commons/f/f2/Bill_Clinton
的链接,但其余部分保持纯文本。我怎样才能使它适用于整个链接?所以你也看到了comma
...我怎样才能把它变成一个链接?
【问题讨论】:
你必须在你的正则表达式中允许%
,它不是\w
字符类的一部分。
它看起来将[\w./=?#-]
更改为[\w./=?#-%]
会解决它。
该死,我试过了。但我在\w
之前添加了%。让我检查一下。
顺序无关紧要,连字符除外。
我明白了。现在我被困在comma
上。我怎样才能添加那个?我在[\w./=?#-]
中尝试了[,.]
,但没有成功
【参考方案1】:
我还试图在 URL 的末尾考虑标点符号(以便我们不包括它)。
<?php
$string = "This works http://upload.wikimedia.org/wikipedia/commons/f/f2/Bill_Clinton%2C_Yitzhak_Rabin%2C_Yasser_Arafat_at_the_White_House_1993-09-13.jpg. This one should fail http://www.youtube.com/v/adlskdfjasopie. Although this one should fail as well http://youtu.be/adlkajdaslk.";
$string = preg_replace("~(?!(?:https?://(?:www\.)?|www\.)(?:youtu))(?:https?://(?:www\.)?|www\.)[^\s]+[^.!?,\<\]\[\)(]~i",'<a href="$0">$0</a>',$string);
?>
输出
This works <a href="http://upload.wikimedia.org/wikipedia/commons/f/f2/Bill_Clinton%2C_Yitzhak_Rabin%2C_Yasser_Arafat_at_the_White_House_1993-09-13.jpg. ">http://upload.wikimedia.org/wikipedia/commons/f/f2/Bill_Clinton%2C_Yitzhak_Rabin%2C_Yasser_Arafat_at_the_White_House_1993-09-13.jpg. </a>This one should fail http://www.youtube.com/v/adlskdfjasopie. Although this one should fail as well http://youtu.be/adlkajdaslk.
【讨论】:
谢谢,但这确实覆盖了我的代码,我已经排除了 Youtube 链接。所以在这种情况下,这不是我正在寻找的答案。你能增强我自己的代码吗? @Johan 更新了我的代码以显示这一点。另外,不要使用所有 youtube.com,只指定“youtu”,这样您也可以过滤掉 youtu.be 地址。 兄弟,感谢您的帮助,但我需要使用相同的结构(preg_replace),并且没有其他变量或内容,因为我使用的是 Wordpress。 @Johan 啊。足够简单的修复。 @Absolutezero:您的代码也得到了链接所在的</p>
。你能解决这个问题吗?以上是关于正则表达式没有在特殊字符处获得整个链接的主要内容,如果未能解决你的问题,请参考以下文章