我有支持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标记中的网址呢?
答案 0 :(得分:2)
这可能不是最好的&#34;解决方案,但您可以使用否定的lookbehind((?<!...)
)来确保该网址不以'
,"
或=
作为前缀。显而易见的限制是,如果有人写了类似的东西:
让我们访问&#34; https://google.com&#34;在我们的电脑上。或者链接= https://google.com。
无论如何,负面的lookbehind将出现在表达式的最开头并包含一个字符类:["'=]
。
(?<!["'=])(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)