正则表达式模式,用于匹配带或不带http(s)和没有标签的URL

时间:2017-03-07 16:04:59

标签: php regex expression

我根本不擅长正则表达式。

我想做什么?我希望将所有网址与特殊字符串匹配。

基本上,我希望将所有网址与<a> - 标记相匹配,但现有的<a> - 标记除外。

例如,应匹配以下字符串:

  

喂!我是一个文字点击这里,有很多   网址www.aon.at?this=true和www.aon.at.一切都应该匹配   正确http://www.aon.at并且也适用于aon.at/this?true

应该匹配什么:

  

喂!我是一个文字&lt; a href =&#39; www.aon.at&#39; &gt;点击此处&lt; / a&gt ;,这有很多   网址 www.aon.at?this=true www.aon.at 。一切都应该匹配   正确地 http://www.aon.at 并且也适用于 aon.at/this?true

我尝试过来自Linkify Regex Function PHP Daring Fireball Method

的正则表达式
(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
页面https://regex101.com/上的

但它不按我希望的方式工作。正如您所看到的,正则表达式与<a> - 标记匹配,我不知道如何删除它。

enter image description here

1 个答案:

答案 0 :(得分:0)

没关系,找到了解决方案。

使用该解决方案,一切正常

$pattern = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'".,<>?«»“”‘’]))';     
return preg_replace("!$pattern!i", "<a href=\"\\0\" rel=\"nofollow\" target=\"_blank\">\\0</a>", $str);