0

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

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
        )

)

在模式中没有“find”的情况下工作正常(但随后也找到了带有“dont”的那个。

这可能是什么原因?

4

1 回答 1

3

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

所以你的正则表达式是

!{find(.*?)}!is

或者,您可以使用[^{}]而不是.*?.. 在这种情况下,您不需要使用单行模式

!{find([^{}]*)}!i
于 2013-10-26T18:18:57.613 回答