【发布时间】:2012-04-26 14:26:39
【问题描述】:
我正在网站上创建评论部分。 起初我需要做一个正则表达式来查找任何 url 并将其替换为
<a href="url"></a>
所以我找到了一个超级正则表达式来查找评论中的所有 url,并且我做了一个返回所有带有 html 标签的 url 的函数:
function addURLTags($string) {
$pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
return preg_replace($pattern, '<a href="$1">$1</a>', $string);
}
一切都很顺利。但是一周前我的老板告诉我,现在我必须将 bbcode 添加到评论部分。我说“没问题”……但后来他告诉我,我的函数 addURLTags 必须保留。
所以任何这样的字符串:
http://www.google.com
[url]http://www.google.com[/url]
[url="http://www.google.com"]http://www.google.com[/url]
必须替换成相同的字符串:
<a href="http://www.google.com">http://www.google.com</a>
所以我得到了一个小的 php 库,它将所有 bbcode 出现替换为 html 代码。
我想:“好吧,首先我应该得到所有在开始时没有 [url] 标签的 url 出现!然后我替换所有 bbcode 标签”
我试图在超级正则表达式的开头添加一个否定断言,如下所示:
/(?i)\b((?![url])(?:https?://|www\d{0,3}[.]|[a-z0-9.-]+[ .][az]{2,4}/)(?:[^\s()]+|(([^\s()]+|(([^\s()] +)))))+(?:(([^\s()]+|(([^\s()]+)))))|[^\ s`!()[]{};:'\".,?«»“”'']))/
但没用!
我是正则表达式的新手,我尝试过的所有在线测试人员都不能很好地使用这么长的正则表达式。我不知道还有什么尝试。
你有什么建议吗?你知道任何 PHP 库可以使用和不使用 [url] bbcode 标签进行“url 替换”吗?
提前谢谢你。
【问题讨论】: