我一直在尝试遍历一个字符串并用链接查找和替换 URL,这是我到目前为止所提出的,它似乎在大多数情况下工作得很好,但是有一些我想要的东西抛光。此外,它可能不是最好的执行方式。
我已经在 SO 上阅读了很多关于此的主题,虽然它有很大帮助,但我仍然需要解决它的松散端。
我在字符串中运行了两次。我第一次用 html 标签替换 bbtags;第二次我遍历字符串并用链接替换文本网址:
$body_str = preg_replace('/\[url=(.+?)\](.+?)\[\/url\]/i', '<a href="\1" rel="nofollow" target="_blank">\2</a>', $body_str);
$body_str = preg_replace_callback(
'!(?:^|[^"\'])(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?!',
function ($matches) {
return strpos(trim($matches[0]), 'thisone.com') == FALSE ?
'<a href="' . ltrim($matches[0], " \t\n\r\0\x0B.,@?^=%&:/~\+#'") . '" rel="nofollow" target="_blank">' . ltrim($matches[0], "\t\n\r\0\x0B.,@?^=%&:/~\+#'") . '</a>' :
'<a href="' . ltrim($matches[0], " \t\n\r\0\x0B.,@?^=%&:/~\+#'") . '">' . ltrim($matches[0], "\t\n\r\0\x0B.,@?^=%&:/~\+#'") . '</a>';
},
$body_str
);
到目前为止,我发现的几个问题是它倾向于在“http”等之前立即拾取字符,例如空格/逗号/冒号等,这会破坏链接。因此,我使用 preg_replace_callback 来解决这个问题并修剪一些会破坏链接的不需要的字符。
另一个问题是,为了避免通过匹配已经在 A 标记中的 url 来破坏链接,我目前正在排除以引号、双引号开头的 url,我宁愿使用 href='|href=" 进行排除。
任何提示和建议将不胜感激