将URL转换为链接,除非它们在使用PHP的BBCode中

时间:2014-06-05 15:45:02

标签: php regex bbcode

我有支持BBCode的文本,我使用自定义PHP函数来替换而不是使用PECL包或任何东西。转向很有用:

[url=http://www.google.com]Google[/url]

<a href="http://www.google.com" target="_blank">Google</a>

我还有一个自定义BBCode标记,可以将标记转换为iframe:

[customtag]abc[/customtag]

<iframe src="http://example.com/abc"></iframe>

但是现在我需要更改通常键入的网址以将其转换为链接。所以,如果你输入:

http://www.google.com

它将把它变成:

<a href="http://www.google.com" target="_blank">Google</a>

我用这个正则表达式来做到这一点:

$string = preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $string);

但它也匹配bbcode中的内容。如果我在解析bbcode后包含它,那么它会改变锚点中的内容。也适用于图像和iframe。

那么如何更改普通网址但忽略bbcode标记内或已存在于html标记中的网址呢?

1 个答案:

答案 0 :(得分:2)

这可能不是最好的&#34;解决方案,但您可以使用否定的lookbehind((?<!...))来确保该网址不以'"=作为前缀。显而易见的限制是,如果有人写了类似的东西:

  

让我们访问&#34; https://google.com&#34;在我们的电脑上。或者链接= https://google.com

无论如何,负面的lookbehind将出现在表达式的最开头并包含一个字符类:["'=]

(?<!["'=])(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)

Demo