Php 自动链接正则表达式
我使用PHP函数自动将文本字符串中的URL转换为人们可以点击的实际链接。它似乎在大多数情况下都有效,但我发现有些情况下它不起作用 我根本不懂正则表达式,所以我希望有人能帮我解决这个问题 以下是我当前使用的模式: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
$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-假设地址开头的数字不匹配
$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