自动链接正则表达式

She*_*ght 8 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";
Run Code Online (Sandbox Code Playgroud)

不过这里有一些链接,我发现这个模式不匹配:

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

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

编辑 - 它还应该匹配最后可能有句点的URL.如果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;
Run Code Online (Sandbox Code Playgroud)

Lit*_*tty 5

以下正则表达式将匹配URL:

  • (可选)使用http://https://
  • (可选地)使用一个子域(www.example.com,help.example.com等)
  • 被1-3个域扩展,其中每个必须是2-6个字符(www.example.com.gu,www.example.com.au.museum等)
  • (可选)在末尾加上正斜杠
  • (可选)使用正斜杠后的有效字符

/i在年底令它大小写不敏感.

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

编辑:这不会匹配最后的任何"挂起"句点(例如句子的结尾),因为它不是URL的一部分,并且不应包含在href链接的属性中.

编辑2:在你的第一个preg_replace(),$1改为$0.这将插入整个匹配的字符串而不是它的单个部分.

编辑3: (更新2)这里有一个更好的办法,你可以检查一个http://https://开头:

preg_replace("/href='[^h][^t][^t][^p][^s]?[^:]/", "/href='http:\/\/", $string);
Run Code Online (Sandbox Code Playgroud)