所以我有这段代码:
$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://”和“www”。部分,为了简洁起见。
事情是,这个网站的管理员能够以HTML格式输入。如果他们这样做,它会变成一个可怕的混乱。类似&lt; a href =“&lt; a href =”http://www.site.com“&gt; site.com&lt; / a&gt;”&gt; text&lt; / a&gt; 。< / p>
我尝试更改正则表达式以确保给定的URL之后没有引号(很可能表示它是超链接锚标记的一部分),如下所示:
$sURLRegExp = '/http\:\/\/([a-z0-9\-\.]+\.[a-z]{2,3}(\/\S*)?([^"])/i';
......但它似乎不起作用。我知道前瞻性断言,但没有想法如何使用它们。在这种情况下,这是最好用的吗?如何检测此URL周围是否存在锚标记?
注意:我知道我可以在整个邮件中使用 strpos(...)!== false ,但这并不考虑普通网址和锚标记的混合在同一条消息中。
答案 0 :(得分:1)
嗯,事实证明我没有彻底搜索Stack Overflow。我所要做的只是将(?<![">])
添加到正则表达式的开头,如下所示:
$sURLRegExp = '/(?<![">])http\:\/\/([a-z0-9\-\.]+\.[a-z]{2,3}(\/\S*)?)([^"])/i';
......而且效果很好。我保留这个以供将来参考这个帖子的其他任何人参考。