invalid range in character class警告が出たら正規表現の文字クラスにあるハイフンを確認する

この投稿は最終更新日から1年以上経過しています

古いスクリプトを動かしたらこんな警告が出た。

Warning: preg_match(): Compilation failed: invalid range in character class at offset 33 in ~

該当コードは

if (!preg_match('|\Ahttps?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?\z|', $url)) {

この箇所で、文字クラス[\w- ./?%&=]にあるハイフンがリテラルではなく範囲と見なされてしまっているようだ。調べてみると、PHP7.3で正規表現ライブラリがPCRE2へ移行したことによる影響だという。

今後、文字クラスでハイフンリテラルを表現したい場合には

//エスケープする
[\w\-.]
//先頭に置く
[-\w.]
//末尾に置く
[\w.-]

といった書き方をすること。

参考