多行PHP BB代码

时间:2012-10-02 14:37:05

标签: php regex multiline bbcode

当我使用

时,我无法弄清楚如何让我的正则表达式选择多行
[b]Test[/b]

我的BB代码工作正常,但是当我尝试

[b]
Test
[/b]

我已经读过我应该在我的正则表达式中使用修饰符/s /m但是我不知道如何,我尝试过:preg_match_all('\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]/m/s'但它不起作用。

任何建议?

工作示例:

$tags = 'b|i|size|color|center|quote|url|img';
while (preg_match_all('`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`', $string, $matches))
    foreach ($matches[0] as $key => $match) {
        list($tag, $param, $innertext) = array($matches[1][$key], $matches[2][$key], $matches[3][$key]);

1 个答案:

答案 0 :(得分:2)

添加修饰符的语法不正确。首先,您不需要任何斜杠来应用它们。它们只属于分隔符(在您的情况下不是/而是`)。而且你也不需要再次划分每一个修饰符,只需将它们粘在一起:

'`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`ms'

您使用哪个分隔符并不重要。查看PHP documentation on delimiters。你可以使用

  

任何非字母数字,非反斜杠,非空白字符。

请注意必须转义分隔符。因此,`/之间没有区别。如果您使用/代替,那么您需要在正则表达式中转义/(否则PHP会假设这是正则表达式的结尾)。像这样:

'/\[(' . $tags . ')=?(.*?)\](.+?)\[\/\1\]/ms'

因此,分隔符的选择主要是为了方便 - 如果可能的话,使用在正则表达式中不会出现的分隔符,因此您不必逃避它。 /只是最常见的选择,这就是为什么您可能找到了添加修饰符的/m符号。由于PHP文档状态是常见的选择,#~(我也经常看到!