BBCode 正则表达式在尝试将模式与回车匹配时过于贪婪 return

BBCode Regex is too greedy when trying to match pattern with a carriage return

我正在使用 preg_replace 来匹配字符串中的 BBCode 模式并将其替换为我自己的 HTML.

我的基本模式如下\[col=([^"]+?)\]((.|\n)+)\[\/col\]\

现在我尝试 运行 的字符串是:

[col=Test]

Test

[/col]



[col=Test2]
asd
[/col]

(是的,像那样的马车 returns :)

现在,如果我只有一个 [col] 标签,它可以正常工作,但是如果有两个这样的 col 标签,它只会匹配外部标签,并将所有内容放在一个大匹配中,而不是两个单独的匹配中。我认为我的 ((.|\n+) 正则表达式太激进了,但我不知道如何缩小它。如果我做一个简单的 (.*?) 那么它就不会匹配第一个案例与马车returns在里面。

谢谢!

使用 DOTALL 修饰符 (?s) 使点与换行符匹配。

(?s)\[col=([^"]+?)\](.+?)\[\/col\]

DEMO