好的,我解决了这个问题。感谢@Cyborgx37 和@MikeBrant 的帮助。这是解决方案。
首先,我用 João Castro 在这个问题中使用的模式替换了我的正则表达式模式:Making a url regex global
该模式的问题在于它在末尾捕获了任何尾随点,因此在模式的最后一部分中,我添加了^.
使最终部分看起来像这样[^\s^.]
。当我阅读它时,不要匹配尾随空格或点。
如上所述,这仍然导致匹配 bbcode 的问题,因此我使用 preg_replace_callback() 和 create_function() 将其过滤掉。最终的 create_function() 如下所示:
create_function('$match','
$match[0] = preg_replace("/\[\/?(.*?)\]/", "", $match[0]);
$match[0] = preg_replace("/\<\/?(.*?)\>/", "", $match[0]);
$m = trim(strtolower($match[0]));
$m = str_replace("http://", "", $m);
$m = str_replace("https://", "", $m);
$m = str_replace("ftp://", "", $m);
$m = str_replace("www.", "", $m);
if (strlen($m) > 25)
{
$m = substr($m, 0, 25) . "...";
}
return "<a href=\"$match[0]\" target=\"_blank\">$m</a>";
'), $string);
到目前为止的测试看起来不错,所以我很高兴它现在已经解决了。
再次感谢,我希望这对其他人有帮助:)