1

当我使用时,我无法弄清楚如何让我的正则表达式选择多行

[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]);
4

1 回答 1

2

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

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

您使用哪个分隔符根本不重要。查看有关分隔符的 PHP 文档。您可以使用

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

请注意分隔符必须被转义。`所以和根本没有区别/。如果你/改用,那么你需要/在正则表达式中转义(否则 PHP 将假定这是正则表达式的结尾)。像这样:

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

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

于 2012-10-02T14:50:05.820 回答