4

我有一个这样的字符串

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

我试过这样

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

如果我执行这个,我会得到如下输出

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

我只想要第一场比赛

[[test search string]]

可能吗?

4

2 回答 2

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修饰符将使正则表达式中的所有, *,+匹配?尽可能少的字符。此外,过去不贪心的量词(*?+???)现在将变得贪心(匹配尽可能多的字符)。

于 2013-08-08T15:02:22.030 回答
2

试试这个方法:

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

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

print_r($match);
于 2013-08-08T15:04:10.130 回答