提问者:小点点

用PHP将纯文本URL转换为HTML超链接


我有一个简单的评论系统,人们可以在纯文本领域内提交超链接。 当我将这些记录从数据库显示回来并显示到web页面中时,我可以使用PHP中的什么RegExp来将这些链接转换为HTML类型的锚链接?

我不希望算法在任何其他类型的链接上这样做,只是http和HTTPS。


共3个答案

匿名用户

这里是另一个解决方案,这将捕获所有HTTP/HTTPS/WWW,并转换为可点击链接。

$url = '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i'; 
$string = preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;

或者,如果只捕获HTTP/HTTPS,则使用下面的代码。

$url = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';   
$string= preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;

编辑:下面的脚本将捕获所有的url类型,并将它们转换为可点击的链接。

$url = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;

新的更新,如果你有字符串删除(s),那么使用下面的代码块,感谢@Andrewellis指出这一点。

$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;

这里有一个非常简单的解决方法,可以解决URL显示不正确的问题。

$email = '<a href="mailto:email@email.com">email@email.com</a>';
$string = $email;
echo $string;

这是一个非常简单的修复,但您必须为自己的目的修改它。

我已经提供了多个答案,因为一些服务器是不同的设置,所以一个答案可能对一些工作,但对其他,但我希望答案(s)为你工作,如果不是,然后让我知道,希望我可以提出另一个解决方案。

匿名用户

嗯,Volomike的答案更接近。 再往前推一点,这里是我为它做的,忽略了超链接末尾的尾随句点。 我还考虑了URI片段。

public static function makeClickableLinks($s) {
  return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
}

匿名用户

<?
function makeClickableLinks($text)
{

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

// Example Usage
echo makeClickableLinks("This is a test clickable link: http://www.websewak.com  You can also try using an email address like test@websewak.com");
?>

相关问题