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 に答える