PHP在字符串中查找URL并创建链接。如果还没有链接

时间:2015-05-13 10:42:53

标签: php hyperlink preg-replace preg-match

我想在链接中尚未包含链接的字符串中找到URL

我当前的代码:

$text = "http://www.google.com is a great website. Visit <a href='http://www.google.com' >http://google.com</a>"
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";


if(preg_match($reg_exUrl, $text, $url)) {
   $links = preg_replace($reg_exUrl, '<a href="'.$url[0].'" rel="nofollow">'.$url[0].'</a>', $_page['content']['external_links']);

}

这个问题是它返回了两次链接(这就是它返回的内容):

<a href="http://www.google.com" rel="nofollow">http://www.google.com</a> is a great website. Visit <a href='<a href="http://www.google.com" rel="nofollow">http://www.google.com</a>' ><a href="http://www.google.com" rel="nofollow">http://www.google.com</a></a>

1 个答案:

答案 0 :(得分:1)

我在这里假设你想要匹配的URL后面跟空格,标点符号或者在一行的末尾。当然,如果有<a href="site">http://url </a>这样的东西,那么它也不会起作用。如果您希望遇到这种情况,请先将所有\s+</a>替换为</a>

$text = "http://www.google.com is a great website. Visit <a href='http://www.google.com' >http://google.com</a>, and so is ftp://ftp.theweb.com";
$reg_exUrl = "/((http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})([\s.,;\?\!]|$)/";

if (preg_match_all($reg_exUrl, $text, $matches)) {
    foreach ($matches[0] as $i => $match) {
        $text = str_replace(
            $match,
            '<a href="'.$matches[1][$i].'" rel="nofollow">'.$matches[1][$i].'</a>'.$matches[3][$i],
            $text
        );
    }
}

输出:

http://www.google.com是一个很棒的网站。访问http://www.google.com' &gt; http://google.comftp://ftp.theweb.com

也是如此