2012-04-14 29 views
3

即时通讯在网站上发表评论部分。 起初,我需要做的正则表达式查找任何URL和替换它与Url正则表达式为preg_replace,但没有匹配bbcode内的网址[url]

<a href="url"></a> 

所以,我发现了一个超正则表达式包围找到注释的所有URL的,我做的是返回所有功能网址为html标记:

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 ocurrences到HTML代码。

我想:“好吧,第一我应该没有在beggining一[url]标签的所有URL ocurrences其次我代替所有的UBB标签!”

我试着在超级正则表达式的开始处添加一个否定断言,如下所示:

/(?i)\ b((?![url])(?:https?:// | www \ d {0, 3)[。] | [a-z0-9 .-] + [。] [az] {2,4} /)(?:[^ \ s()<>] + |(([^ \ s )>] + |(([^ \ s()<>] +)))))+(::(([[\ s(012)<>] + |(([^ \ s >] +))))| [^ \ s`!()[] {};:'\“。,<>?«»”“'']))/

但没有工作!

林有点新手正常表达式和我尝试过的所有在线测试人员不能很好地处理如此长的正则表达式。我不知道还有什么尝试。

你有什么建议吗?你知道有没有“url替换”,有没有[url] bbcode标签的PHP lybrary?

预先感谢您。

回答

1

您在这里解决了两个问题。因此,分开解决它们,不要将所有东西都解释为一个单一的正则表达式,这或多或少会使事情变得更复杂而不是更少。

分而治之:

首先使用设置高亮库,可找到这些网址都是部位,使您可以创建一个文本流:

"normal text", "bbcode", "normal text", "bbcode" 

然后你擦上BB代码库仅在“bbcode”细分受众群上创建网址,而您的网址可点击制作者仅适用于“普通文字”细分受众群。

在处理好所有的段后,将所有段连接成一个字符串。

瞧,问题解决了。

+0

我非常专注于按照自己的方式做事,因此我无法看清所有可能性。 我分割了注释字符串并保存了所有bbcode的字符串。然后我将所有这些发送到bbcodelibrary。其余的字符串与超正则表达式正常工作。 完美。非常感谢! – 2012-04-14 20:47:16

0

最好先解析[url] BBCodes,然后将任何裸露的URL链接到链接中。这很容易通过使用负面倒序来确保在URL之前没有双引号。这是有效的,因为您应该已经将原始字符串中的引号转换为&quot;,因此URL之前的任何实际引号都必须作为链接创建者的一部分放在那里。