• 締切済み

【PHP】ereg() で文字種判定するときエラーになる

PHP5使用者です。 ereg() でよくわからないエラーに直面して悩んでおります。 例えば、サンプル文字列が半角数字a~z又は -(ハイフン)のみで構成されているか調べたい場合、以下の方法を試しました。 1)if( ereg("^[\-a-z]+$", $str )){ 2)if( ereg("^[a-z-]+$", $str )){ 3)if( mb_ereg("^[\-a-z]+$", $str )){ 4)if( preg_match("/^[\-a-z]+$/", $str )){ 但し $str はシングルバイト文字です 結果、1)のみエラーになります。-をエスケープしているのになぜでしょうか? 文字コードはShift_JIS、EUC-JP、UTF-8とも試しましたが同じでした。そもそも常にマルチバイト関数を使うべきとか…? 解説していただける方、よろしくお願いいたします。

みんなの回答

  • JV44
  • ベストアンサー率50% (24/48)
回答No.2

preg_matchはUTF-8の場合のみマルチバイトに対応しています。 パターン識別子のuオプションの指定が必要です。 その他の文字コードについてはmb_eregを使うのが妥当でしょう。

参考URL:
http://jp2.php.net/manual/ja/reference.pcre.pattern.modifiers.php
ikataro
質問者

お礼

ありがとうございます。 そうですか。マルチバイトが出てこないならmb_は蛇足と思っていましたがそんなことないのですね。 勉強になりました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

eregはマルチバイト文字に対応していませんし、文字クラスの中での エスケープは(eregでは)利きません。 マルチバイト文字がデータとしてくる可能性があるなら対応した関数を使うべきでしょう。 まあUTF-8なら対応のものでなくてもあまり痛い目を見ないですむと思いますが。

ikataro
質問者

お礼

ありがとうございます。 つまり、mb_ereg() か preg_match() にしておけば問題ない、ということでしょうか?