将url转换为HTML超链接,同时避免已经格式化的超链接


Converting URLs to HTML hyperlinks while avoiding already-formatted hyperlinks

所以我有这样的代码:

$sURLRegExp = '/http':'/'/([a-z0-9'-'.]+'.[a-z]{2,3}('/'S*)?)/i';
$iURLMatches = preg_match($sURLRegExp, $sMessage, $aURLMatches);
if ($iURLMatches > 0) {
    $sURL = $aURLMatches[1];
    $sURL = str_replace('www.', '', $sURL);
    $sMessage = preg_replace($sURLRegExp, '<a href="http://$1" target="_blank">' . 
        $sURL . '</a>', $sMessage);
}

它完美地转换了所有传入的消息,因此输入的普通url将变成HTML超链接,甚至为了简洁而删除了"http://"answers"www."部分。

问题是,这个网站的管理员可以在HTML中输入。如果他们这样做了,就会把它变成一个可怕的烂摊子。就像 & lt; a href = " & lt; a href = " http://www.site.com "祝辞site.com"祝辞text

我尝试改变正则表达式,以确保没有引号后给定的URL(这很可能表明它是一个超链接锚标记的一部分),如:

$sURLRegExp = '/http':'/'/([a-z0-9'-'.]+'.[a-z]{2,3}('/'S*)?([^"])/i';

…但这似乎不起作用。我知道预检断言,但是对于如何使用它们完全没有概念。在这种情况下,这是最好的方法吗?如何检测此URL周围是否存在锚标记?

注意:我知道我可以在整个消息上使用strpos(…)!== false,但这并不能解释在同一消息中混合使用纯url和锚标记

嗯,原来我没有彻底搜索Stack Overflow。我所要做的就是将(?<![">])添加到正则表达式的开头,如下所示:

$sURLRegExp = '/(?<![">])http':'/'/([a-z0-9'-'.]+'.[a-z]{2,3}('/'S*)?)([^"])/i';

…而且效果很好。我把这篇文章保留下来,以供将来看到这篇文章的人参考。