【问题标题】:Multiline PHP BB Code多行 PHP BB 代码
【发布时间】:2023-03-27 15:50:01
【问题描述】:

当我使用时,我不知道如何让我的正则表达式选择多行

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

【问题讨论】:

  • 我不确定这就是全部,但您缺少一个开始分隔符(另一个 /)并且应用多个修饰符无需额外的斜杠:'/.../ms'
  • 哦,我明白了。您的分隔符是`。在这种情况下,您根本不需要斜杠,只需:'`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`ms'
  • 完美!非常感谢
  • 那我会做出正确的回答。
  • 使用 ` 和 / 有什么区别?你能告诉我和例子在哪里只使用 / 。

标签: php regex multiline bbcode


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多