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

时间:2013-08-08 14:52:33

标签: php preg-match

我有一个这样的字符串

var str = 'abcd [[test search string]] some text here ]]';

我试过这样的

* preg_match("/\[\[test.*\]\]/i",$str,$match);

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

[[test search string]] some text here ]]

我希望第一场比赛只有

[[test search string]]

有可能吗?

2 个答案:

答案 0 :(得分:11)

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

preg_match("/[[test.*]]/i",$str,$match);

使用

preg_match("/\[\[test.*?\]\]/i",$str,$match);

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

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

preg_match("/\[\[test.*\]\]/iU",$str,$match); 

也适用于此目的。 U修饰符会使正则表达式中的所有*+?匹配尽可能少的字符。此外,曾经不合适的量词(*?+???)现在变得贪婪(尽可能多地匹配)。

答案 1 :(得分:2)

尝试这种方式:

$str = "var str = 'abcd [[test search string]] some text here ]]';";

preg_match("/(\[\[test[^]]*\]\])/im", $str, $match);

print_r($match);