自动链接正则表达式

时间:2012-06-03 23:12:19

标签: php regex url

我正在使用PHP函数自动将文本字符串中的URL转换为人们可以单击的实际链接。它似乎在大多数情况下都有效,但我发现有些情况并非如此。

我根本不理解正则表达式,所以我希望有人可以帮我解决这个问题。

以下是我目前正在使用的模式:

$pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9.,_\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";

但是这里有一些链接我发现这种模式不匹配:

  • www.oakvilletransit.ca - 不确定,但由于两个字母的国家/地区代码而无法匹配
  • www.grt.ca - 另一个无效的.ca域名
  • 其他几个.ca地址
  • freepublictransports.com - 没有www的地址。或http://在他们面前。我希望这些也可以。
  • www.222tips.com - 假设由于地址开头的数字而不匹配。

有谁知道如何修改那个正则表达式模式以匹配这些情况?

编辑 - 它还应匹配最后可能包含句点的网址。如果URL是句子的最后部分,则最后可能有一段不应包含在实际链接中的句点。目前,这种模式也考虑到了这一点。

编辑2 - 我正在使用这样的模式:

$pattern = "/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z][a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is";
  $string = preg_replace($pattern, " <a target='_blank' href='$1'>$1</a>", $string);
  // fix URLs without protocols
  $string = preg_replace("/href='www/", "href='http://www", $string);
  return $string;

2 个答案:

答案 0 :(得分:5)

以下正则表达式将匹配网址:

  • (可选)使用http://https://
  • (可选)使用子域名(www.example.comhelp.example.com等)
  • 包含1-3个域名扩展名,每个扩展名必须为2-6个字符(www.example.com.guwww.example.com.au.museum等)
  • (可选)在末尾加上正斜杠
  • (可选)使用正斜杠后的有效字符

最后的/i会使案例不敏感

/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is

编辑这不会匹配最后的任何“挂起”句点(例如句子的结尾),因为它不是网址的一部分,不应包含在{您链接的{1}}属性。

修改2 :在您的第一个href中,将preg_replace()更改为$1。这将插入整个匹配的字符串,而不是单个部分。

编辑3:更新2 )以下是​​您可以在开头检查$0http://的更好方法:

https://

答案 1 :(得分:3)

我上面的所有例子都有问题。

这是一个有效的方法:

function autolink($string){
        $string= preg_replace("#http://([\S]+?)#Uis", '<a href="http://\\1">\\1</a>', $string);
        return $string;
}