我正在制作从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
以产生预期结果?
答案 0 :(得分:0)
模式与您测试的实际字符串不匹配。在模式中,您在/
中有[/quote]
,而在字符串中,您有\
([\quote:c1891a7ad3]
)。
因此,如果您的实际字符串实际上有/
,那么您需要修复的是(.*)
部分,因为该点匹配任何字符(包括]
),因此甚至可以匹配与懒惰匹配。
所以,使用
$regex = "#\[quote:([^]]*)=([^]]*)\](.+)\[/quote:([^]]+)\]#isU";
请参阅IDEONE demo
在这个正则表达式中,我使用了一个否定的字符类[^]]*
,它匹配 0个或更多字符而不是]
。它确保我们只匹配[...]
内的文字。 (.*)
matches c1891a7ad3]
text with link https://www.facebook.com/groups/35688476100/?fref
,因此我们需要以某种方式对此进行限制。