preg_match(): invalid range in character class at offset 7

preg_match(): invalid range in character class at offset 7

PHP5.3からPHP5.6にアップデートにしたときに、正規表現の仕様書変更によって、よく起きるエラーのようです。

エラーの意味

エラーメッセージは、「正規表現で指定している範囲に文字は存在しません」といった感じの内容になっています。

エラーの原因

エラーの原因は、正規表現内に書かれている「-(ハイフン)」にあります。

PHP5.6以前は、[\.-\w]の様な形でもエラーは出ませんが、
PHP5.6以降は、[\.\-\w]のようにエスケープするか、
[-\.\w] [\.\w-][ ]の初めか最後で-(ハイフン)を指定しなくてはいけなくなりました。

-(ハイフン)がエスケープされていない状態で文字の間にあると
[A-Z]がAからZの間の文字を指すように
[\.-\w]なども.(ドット)と\w([A-Za-z0-9_])の間の文字を指しているとPHPに解釈されてしまい「指定している範囲に文字は存在しません」っとPHPに怒られてしまいます。

エラーの解消法

エラーの解消法は、前述通り

  1. -(ハイフン)をエスケープする
  2. [ ]の初めか最後で-(ハイフン)を指定する

のどちらかで可能です。