Php 自动链接正则表达式

Php 自动链接正则表达式,php,regex,url,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

我使用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.oakvilletion.ca-不确定,但假设由于两个字母的国家代码,它不匹配
  • www.grt.ca-另一个具有.ca域但不工作的
  • 其他几个.ca地址
  • freepublictransports.com-前面没有www.或http://的地址。我希望这些也能起作用
  • www.222tips.com-假设地址开头的数字不匹配
有人知道我如何修改regex模式以匹配这些情况吗

编辑-它还应匹配结尾可能有句点的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;
$pattern=“/((http | https):\/\/)?([a-z0-9-]+\)?[a-z][a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,[U\/~+-]*)/is”;
$string=preg_replace($pattern,“,$string);
//修复没有协议的URL
$string=preg_replace(“/href='www/”,“href='www/”)http://www“,$string);
返回$string;

以下正则表达式将与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.,[u\/~&=;%+?-])?/is

编辑:这将不匹配结尾处的任何“挂起”句点(例如句子结尾),因为它不是URL的一部分,不应包含在链接的
href
属性中

编辑2:在第一次
preg_replace()
中,将
$1
更改为
$0
。这将插入整个匹配字符串,而不是其中的一部分

编辑3:(更新2)以下是一种更好的方法,您可以在开始时检查
http://
https://

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

我对上面所有的例子都有疑问

以下是一个有效的方法:

function autolink($string){
        $string= preg_replace("#http://([\S]+?)#Uis", '<a href="http://\\1">\\1</a>', $string);
        return $string;
}
函数自动链接($string){
$string=preg#u replace(“#http:/([\S]+?)#Uis”,”$string);
返回$string;
}

Regex提示:
[s]?
不是必需的。只需使用
s?
.Regex提示:
{1,1}
没有任何意义。
{2,2}
。好的,我在另一个问题上找到了这个代码。那么更改[s]?到s?移除{1,1}和{2,2}不会有什么区别吗?不,没有区别。但是请确保将
{2,2}
替换为
{2}
;不要只是把它拿出来。可能是Derp的复制品。这是在regexbuddy身上做的忘了逃走。更新了答案,谢谢。编辑:我从来不知道你可以使用不同的字符作为分隔符!很高兴知道这一点,谢谢。如果您将
$string=”http://www.example.com/“
,并通过第一个
preg\u replace()
,运行它,
var\u dump()
告诉您它是什么?更新的答案。将
$1
更改为
$0
。我自己测试了
preg_replace()
,现在应该可以了。我删除了,并且没有让数字成为子域后URL的第一部分(正如您在问题中所建议的)。我更新了模式以允许它们
www.222test.com
现在匹配正确。还提供了edit3,这应该有助于解决您的http://问题。更新后的编辑3应该可以工作。抱歉修改了这么多!:P