正则表达式没有在特殊字符处获得整个链接

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:您的代码也得到了链接所在的&lt;/p&gt;。你能解决这个问题吗?

以上是关于正则表达式没有在特殊字符处获得整个链接的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式特殊符号及用法

如何通过没有模式字符串的正则表达式获得所有干净的链接[重复]

需要在正则表达式中转义的所有特殊字符的列表

正则表达式

正则表达式——关于特殊字符验证

js正则表达