regex 删除字符串中bbcode标记之间的空格

axr492tv  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(119)

我需要删除字符串中相邻BBCode标签之间的所有空格,而不影响BBCode文本中的空格。输入类似于:

*[ul]
    [li]List Item 1[/li]
    [li]List Item 2[/li]
[/ul]*

删除新行和选项卡后,它看起来像这样:

[ul] [li]List Item 1[/li] [li]List Item 2[/li] [/ul]

为了确保空白不会干扰代码,我需要删除命令([ul][li][/ul][/li])之间的所有空白。我如何才能做到这一点?

xwmevbvl

xwmevbvl1#

你可以使用正则表达式和preg_replace()来做这样的事情:

$text = preg_replace('/\[(.*?)\]\s*\[/', '[\1][', $text);

你可以看到这个正则表达式是如何工作的here

5ktev3wc

5ktev3wc2#

模式分解:

(?:^|\[[^]]+])  #match start of string or opening or closing bb tag
\K              #forget the matched characters so far
\s+             #match one or more whitespace characters 
(?=\[[^]]+]|$)  #lookahead for another opening or closing bb tag or the end of the string

代码:(Demo

$bb = ' [ul]
    [li] List Item 1 [/li]
    [li] List Item 2 [/li]
[/ul] ';

var_export(
    preg_replace(
        '#(?:^|\[[^]]+])\K\s+(?=\[[^]]+]|$)#',
        '',
        $bb
    )
);

当然,Regex是一个bbcode无知的工具,它不知道它是匹配合法的bbcode标签,还是只是匹配看起来像bbcode标签的字符。为了提高严格性,您可以指定您希望加入白名单的标签。对于示例字符串,将执行以下操作:Demo

#(?:^|\[/?(?:ul|li)])\K\s+(?=\[/?(?:ul|li)]|$)#

相关问题