我想在链接中尚未包含链接的字符串中找到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>
答案 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.com,ftp://ftp.theweb.com
也是如此