preg_match返回奇怪的结果

时间:2013-10-26 18:14:48

标签: php regex preg-match-all

我需要用花括号提取文本,但前提是它们中的第一个单词是“允许”单词。 例如以下文字:

awesome text,
a new line {find this braces},
{find some more} in the next line.
Please {dont find} this ones.

在这个简单的例子中,“find”代表一个允许的单词

我的尝试:

$pattern        = '!{find(.*)}!is';
$matches        = array();
preg_match_all( $pattern, $text, $matches, PREG_SET_ORDER );

返回一个奇怪的结果(print_r):

Array
(
    [0] => Array
        (
            [0] => {find this braces},
    {find some more} in the next line.
    Please {dont find}
            [1] =>  this braces},
    {find some more} in the next line.
    Please {dont find
        )

)

虽然在模式中没有“找到”的情况下工作正常(但是也找到了带有“不”的那个。

原因可能是什么?

1 个答案:

答案 0 :(得分:3)

.*会尽可能地贪婪地匹配。使用.*?来匹配懒惰,即尽可能少

所以你的正则表达式将是

!{find(.*?)}!is

或者,您可以使用[^{}]代替.*?。在这种情况下,您无需使用单线模式

!{find([^{}]*)}!i