使用preg_replace重新格式化bbcode

时间:2015-07-07 08:20:14

标签: php regex

我正在制作从phpbb到php native的论坛,我需要用uid解析一些bbcode标签。这是在不使用uid的情况下将其解析为常规bbcode的代码:

$regex = "#\[quote:(.*)=(.*)\](.+)\[/quote:(.+)\]#isU";
$text = "outside sample
[quote:c1891a7ad3]
text with link https://www.facebook.com/groups/35688476100/?fref=ts [/quote:c1891a7ad3]
outside text
[quote:c1891a7ad3="Budi"]
written by me , - budi
[/quote:c1891a7ad3]"
preg_replace($regex,"[quote=$2]$3[\quote]",$text);

但结果不是

"outside sample
    [quote:c1891a7ad3]
    text with link https://www.facebook.com/groups/35688476100/?fref=ts  [/quote:c1891a7ad3]
    outside text
    [quote="Budi"]
    written by me , - budi
    [\quote]"

如何修改regex以产生预期结果?

1 个答案:

答案 0 :(得分:0)

模式与您测试的实际字符串不匹配。在模式中,您在/中有[/quote],而在字符串中,您有\[\quote:c1891a7ad3])。

因此,如果您的实际字符串实际上有/,那么您需要修复的是(.*)部分,因为该点匹配任何字符(包括]),因此甚至可以匹配与懒惰匹配。

所以,使用

$regex = "#\[quote:([^]]*)=([^]]*)\](.+)\[/quote:([^]]+)\]#isU";

请参阅IDEONE demo

在这个正则表达式中,我使用了一个否定的字符类[^]]*,它匹配 0个或更多字符而不是] 。它确保我们只匹配[...]内的文字。 (.*) matches c1891a7ad3] text with link https://www.facebook.com/groups/35688476100/?fref,因此我们需要以某种方式对此进行限制。