繁体   English   中英

用于匹配 php 字符串中的 http 和 www url 的正则表达式

[英]regex for matching http and www urls in a php string

这是我正在使用的代码

function parseURL($text) {
    $regex = "#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#iS";
    preg_match_all($regex, $text, $matches);
    foreach($matches[0] as $pattern){
        $text = str_replace($pattern, "<a href=\"$pattern\" target=\"_blank\">$pattern</a> ", $text);   
    }
    return $text;
}

出于某种原因,我的正则表达式输出以下结果:(粗体 = 链接)

www.domain.com

HTTP:// www.domain.com

http://domain.com

所以它工作正常,除非它同时包含 http 和 www,此时它只从 www 部分开始链接。

知道为什么吗?

编辑

对于任何阅读这篇需要修复的人,这里是工作代码,感谢Wiktor Stribiżew ..

function parseURL($text) {
    $regex = "@\b(([\w-]+://?|www[.])[^\s()<>]+(?:\(\w+\)|([^[:punct:]\s]|/)))@i";
    $subst = "<a href='$0' target='_blank'>$0</a>";
    $text = preg_replace($regex, $subst, $text);
    return $text;
}

您无需先收集匹配项,然后再逐个替换。 直接使用preg_replace并使用$0反向引用来引用替换模式中的整个匹配项。

请参阅PHP 演示

$re = '@\b(([\w-]+://?|www[.])[^\s()<>]+(?:\(\w+\)|([^[:punct:]\s]|/)))@i';
$str = "www.domain.com\nhttp://www.domain.com\nhttp://domain.com";
$subst = '<a href="$0" target="_blank">$0</a> ';
$result = preg_replace($re, $subst, $str);
echo $result;

输出:

<a href="www.domain.com" target="_blank">www.domain.com</a> 
<a href="http://www.domain.com" target="_blank">http://www.domain.com</a> 
<a href="http://domain.com" target="_blank">http://domain.com</a> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM