如何在php中使用preg匹配获得第一个可能的匹配

Raj*_*man 4 php preg-match

我有一个像这样的字符串

var str = 'abcd [[test search string]] some text here ]]';
Run Code Online (Sandbox Code Playgroud)

我试过这样的

* preg_match("/\[\[test.*\]\]/i",$str,$match);
Run Code Online (Sandbox Code Playgroud)

如果我执行此操作,我将获得如下所示的输出

[[test search string]] some text here ]]
Run Code Online (Sandbox Code Playgroud)

我想要的第一场比赛就像

[[test search string]]
Run Code Online (Sandbox Code Playgroud)

可能吗?

Tho*_*s F 11

简短回答:是的,你可以.你需要使用惰性量词.而不是

preg_match("/[[test.*]]/i",$str,$match);
Run Code Online (Sandbox Code Playgroud)

使用

preg_match("/\[\[test.*?\]\]/i",$str,$match);
Run Code Online (Sandbox Code Playgroud)

使功能在第一场比赛时停止.注意:如果要匹配文字[]字符,则需要将它们转义为:\[\].

php.net上进行了一些研究后,我发现了一个模式修饰符U(PCRE_UNGREEDY),它将模式的默认值设置为懒惰,因为它与贪婪相关.
所以这意味着

preg_match("/\[\[test.*\]\]/iU",$str,$match); 
Run Code Online (Sandbox Code Playgroud)

也适合这个目的.该U修改将使所有*,+,?在正则表达式匹配尽可能少的字符越好.此外,曾经不合格(*?,+???)的量词现在将变得贪婪(尽可能多地匹配字符).