1

正規表現を持つ正規表現文字クラス(つまり、角かっこで囲まれたすべてのもの)を見つける必要があります。だから私は次の正規表現を思いついた:

(?<!\\)\[(?:\^\])?(?:[^]\\]+|\\.)*\]

そして、その正規表現は、Notepad ++(検索ウィンドウ(Ctrl-F)とRegEx Helperプラグインの両方)でテストすると完全に正常に機能しますが、PHPコードで使用しようとするとエラーが発生します。

$string = '[^abcd\]efgh]';

$pattern = '/
(?<!\\) \[              # an opening square bracket not preceded by a backslash
  (?:\^\])?             # circumflex and closing bracket 0 or 1 times
(?:
  [^]\\]+               # not a closing bracket, nor a backslash 1-n times
 |                      # or
   \\.                  # any escaped character (including an escaped closing bracket)
)*                      # 0-n times
\]                      # closing bracket
/x';

preg_match_all($pattern, $string, $matches);

print_r($matches);

出力:

警告:preg_match_all():コンパイルに失敗しました:21行目のC:... \test.phpのオフセット33にある文字クラスの終了]がありません

私はどこが間違っていますか?

4

1 に答える 1

2

リテラルのバックスラッシュは、PHP正規表現で4つのバックスラッシュで表す必要があります。したがって、試してみてください

$pattern = '/(?<!\\\\)\[(?:\^\])?(?:[^]\\\\]+|\\\\.)*\]/'
于 2013-02-16T18:17:20.650 に答える