2011-02-08 12 views
0

phpのperl互換正規表現(pregライブラリ)は区切り文字として中括弧をサポートしていると思っています。これは問題ないはず:安全区切り文字付きPHP正規表現

{ello {world}i // should match on Hello {World 

中括弧の主なポイントは、それが唯一のように何の内側のもののためにエスケープを必要としない、最も左と右のものを取るということです。私が知る限り、PHPはエスケープする必要があります

{ello \{world}i // this actually matches on Hello {World 

これはphp pregの実装で期待される動作かバグですか?

答えて

1

パターン区切り文字に4組のASCIIブラケットタイプのいずれかを使用する場合は、対角の括弧で囲まれたをパターン内でエスケープする必要があります。これはまさに大括弧を使用する目的全体です。あなたは、多くの場合、人々はPerlコードでm{…}またはqr{…}を使用する参照理由を特に使用し、複数行のパターンのために、だ

Non-bracketing delimiters use the same character fore and aft, 
    but the four sorts of brackets (round, angle, square, curly) 
    will all nest, which means that 

     q{foo{bar}baz} 

    is the same as 

     'foo{bar}baz' 

    Note, however, that this does not always work for quoting Perl code: 

     $s = q{ if($a eq "}") ... }; # WRONG 

:これは一部に読み込み、「引用と引用のような演算子」、下perlopを manページに記載されています/xᴀᴋᴀ(?x)です。例:

return qr{     
    (?=      # pure lookahead for conjunctive matching 
     \A     # always from start 
     . *?    # going only as far as we need to to find the pattern 
     (?: 
      ${case_flag} 
      ${left_boundary} 
      ${positive_pattern} 
      ${right_boundary} 
     ) 
    ) 
}sxm; 

これらのネストされた中括弧には問題はありません。

1

私が知る限り、予想される動作ですが、そうでなければコンパイラはグループリミッタを許可しますか?例えば

[a-z]{1,5} 
+1

http://perldoc.perl.org/perlre.html - "その他の文脈で中括弧が現れた場合、それは通常の文字として扱われます。" – binaryLV

+0

それは今のところよく似ています。最初と最後の括弧のみが考慮された場合。 phpは一つの文字列で検索と置換を行う必要はなく、一つの関数の二つの異なる引数であるので、エスケープされていないものの中にすべてを残しておいても問題ありません。 –

+0

@binaryLV:私の答えでは完全に網羅的ではありませんでしたが、「これは期待される行動です」と逃げていました。しかし、参考のためにありがとう。 –

0

私はエスケープが、この場合に必要とされないことがわかった:

'ello {world'i 
(ello {world)i 

だから私の理論は、問題は「{」の区切り文字であること、です。また、以下の二つが同じエラーを生成する:区切り文字として括弧終了/開始使用

{ello {world}i 
(ello (world)i 

式で与えられたブレースを逃れるために必要とするかもしれません。 http://lv.php.net/manual/en/regexp.reference.delimiters.phpから

1

If the delimiter needs to be matched inside the pattern it must be escaped using a backslash. If the delimiter appears often inside the pattern, it is a good idea to choose another delimiter in order to increase readability.

だから、これは予期された動作ではなく、バグです。

関連する問題