PHP - 函数在文本中查找链接

时间:2010-09-21 17:06:01

标签: php regex hyperlink

我有一个函数可以在超链接中转换'www.example.com'和'http://example.com'等字符串。它还涉及子域,例如'http://sub.example.com'。

但它失败了 - http://www .example.com'并输出以下内容

<a href="http://<a href="http://www.chemica.ru">www.chemica.ru</a>">http://<a href="http://www.chemica.ru">www.chemica.ru</a></a>

拜托,有人可以帮忙吗?问题是'http://'和'www。'在一起,两者都有不同的转换方式。

function makeLinks($text){ 
 $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="\\1">\\1</a>', $text); 
 $text = eregi_replace('(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="http://\\1">\\1</a>', $text);
 $text = eregi_replace('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})', '<a href="mailto:\\1">\\1</a>', $text); 
 return $text; 
}

3 个答案:

答案 0 :(得分:4)

只需写入您的视图页面(您不需要任何库或辅助函数):

$text = "Good Site is http://masalahkita.com";
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text);

echo $link;

答案 1 :(得分:2)

您可能需要阅读this blog post by Jan Goyvaerts,了解有关如何在文本中查找网址的一些想法。

要解决您的直接问题,您可以为第二个正则表达式添加一个负面的lookbehind:(?<!http://)(www.[-a-zA-Z0-9@:%_\+.~#?&/=]+)确保www...只有在http://之前没有匹配时才会匹配。

但是,ereg函数已弃用且不支持环视,因此您需要使用preg_replace()

$text = preg_replace('/(?<!http:\/\/)(www.[-a-zA-Z0-9@:%_\+.~#?&\/=]+)/i', '<a href="http://\1">\1</a>', $text);

应该有用。

答案 2 :(得分:0)

对于'http://''www.' 一起,您可以执行this之类的操作:

$text = "http://www.example.com is a nice site";
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text);
echo $link;

适用于网址的工作以 http://

开头