所以我有这样的代码:
$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';
…而且效果很好。我把这篇文章保留下来,以供将来看到这篇文章的人参考。