前提・実現したいこと
PHP(Version 5.2.8)にて正規表現のpreg_matchを使い、全角カナの入力チェックを行いたい。
画面に全角カナを入力する欄があり、チェックを行いたい。
回答からの結論:
ソースコードがSJISの場合、正規表現のパターンおよび、チェック対象の文字列の
両方をmb_convert_encodingで"UTF-8"へ変換してpreg_matchを行う。
$KANA_UTF8 = mb_convert_encoding($KANA_SJIS, "UTF-8", "SJIS");
preg_match(mb_convert_encoding('/^[ァ-ヴー ]+$/u', "UTF-8", "SJIS"), $KANA_UTF8);
発生している問題・エラーメッセージ
想定通りに動作しない。 正規表現をチェックできるサイト(https://regex101.com/)では、 想定通りの動作をしたが、プログラムに組み込み動作を確認したところ、動きが異なった。
該当のソースコード
PHP
1$KANA = "画面で入力された全角カナ"; 2if ($KANA == "") { 3 $MSG = "必須です"; 4} elseif (!preg_match('/^[ァ-ヴー ]+$/u', mb_convert_encoding($KANA, "UTF-8", "SJIS"))) { 5 $MSG = "カナを入力して下さい"; 6} 7
試したこと
想定した結果はいずれもint(1)でしたが、以下となった。
$KANA_SJIS = "コウ ゾビ";
echo(mb_detect_encoding($$KANA_SJIS)); ⇒SJIS
確認1: var_dump(preg_match('/^[ァ-ヴー ]+$/', $KANA_SJIS)); ⇒結果:int(1)
確認2: var_dump(preg_match('/^[ァ-ヴー ]+$/', "ワ")); ⇒結果:int(0)
$KANA_UTF8 = mb_convert_encoding($KANA_SJIS, "UTF-8", "SJIS");
echo(mb_detect_encoding($KANA_UTF8)); ⇒UTF-8
確認3: var_dump(preg_match('/^[ァ-ヴー ]+$/u', $KANA_UTF8)); ⇒結果:bool(false)
mb_regex_encoding("UTF-8");
確認4: var_dump(preg_match('/^[ァ-ヴー ]+$/u', $KANA_UTF8)); ⇒結果:bool(false)
確認5:
var_dump(mb_ereg('^[ァ-ヴー ]+$', $KANA_SJIS)); ⇒結果:int(1)
var_dump(mb_ereg('^[ァ-ヴー ]+$', "ワ")); ⇒結果:int(1)
補足情報(FW/ツールのバージョンなど)
画面での入力値は、SJISで渡されます。
確認1および2はSJISの状態でチェックしたもので、パスするカナ文字とパスしないカナ文字が存在した。
2バイト目が影響しているような記載を見つけたが、理解できなかった。
https://accelboon.com/tn/s-jis%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%97%E3%81%9F%E3%82%8A%E3%83%88%E3%83%A9%E3%83%96%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%99%E3%82%8B%E3%83%80%E3%83%A1%E6%96%87%E5%AD%97%E3%81%9F/
確認3および4はUTF-8に変換した状態でチェックしたが、いずれもパスしなかった。
確認5のみ、想定通りの動作をした。
preg_matchでは、想定通りの動作を期待できないのか知りたい。
回答2件
あなたの回答
tips
プレビュー