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


Remove whitespace between bbcode tags in a string

我需要删除字符串中相邻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])之间的所有空格。我怎样才能做到这一点?

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

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

您可以在此处可视化此正则表达式的工作原理。

模式细分:

(?:^|'[[^]]+])  #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

代码:(演示)

$bb = ' [ul]
    [li] List Item 1 [/li]
    [li] List Item 2 [/li]
[/ul] ';
var_export(
    preg_replace(
        '#(?:^|'[[^]]+])'K's+(?='[[^]]+]|$)#',
        '',
        $bb
    )
);

当然,正则表达式是一个 bbcode 无知的工具,它不知道它是否匹配合法的 bbcode 标签或只是看起来像 bbcode 标签的字符。 为了提高严格性,您可以指定要列入白名单的标签。 对于示例字符串,执行以下操作:演示

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