質問: ### 前提・実現したいこと 初めて質問させていただきます。 php5.3からphp5.6にバージョンをアップをおこなうと、 下記の記述の場合にエラーが起こってしまいましたので エラーを回避したいです。 ハイフン(-)がエラーの原因のようです。 ### 発生している問題・エラーメッセージ ``` preg_match(): Compilation failed: invalid range in character class at offset 10 ``` ### 該当のソースコード ``` if( ! preg_match("/^([-0-9_-\s])+$/i", "TEST")){ return FALSE; }else{ return TRUE; } ``` ### 試したこと preg_matchの箇所を A. preg_match("/^([-0-9_-\s])+$/i", "TEST") ↓ preg_match("/^([-0-9_\s])+$/i", "TEST")←ハイフン(-)を削除 B. preg_match("/^([-0-9_-\s])+$/i", "TEST") ↓ preg_match("/^([-0-9_\-\s])+$/i", "TEST")←ハイフン(-)の前に\ (バックスラッシュ) 上記のAかBでエラーは回避されたのですが、 なぜエラーが回避されるのか、また前者と後者では同じ結果になるのかがわからなく、投稿させていただきました。
回答: `-`は`A-B`としたときの「AからBの範囲」を表すための記号として使われる特殊文字です。なので、単独で使うとエラーを起こします。しかし、以下の条件のいずれかを満たすと「ただのハイフン」として認識され、使えるようになります。 * []の先頭に-を書く * []の末尾に-を書く * \で-をエスケープする そもそも[]の先頭ですでに-を指定しているので、10文字目にある-自体不要なので、10文字目の-を消してしまったAでも正しく動作します。Bのパターンはもう一度-が指定されているだけですね。