PHP文字列の中に
・全角ひらがな
・全角カタカナ
・全角漢字
・半角英数字(A~Z、0~9)
・半角のハイフン「-」
・半角のドット「.」
以外の文字列がないか確認したいです。
http://www.tryphp.net/2012/03/03/phpsample-preg-str-2/
上記サイトを見つけたのですが、組み合わせ方が分かりませんでした。
ご回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
・全角漢字
目的によりますが一言で漢字と言ってもいろいろです。正規表現だと意図しない文字も範囲に含まれているかもしれません。
lang
1<?php 2$str = "丆"; 3 4function is_valid_japanese($str) 5{ 6 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 7} 8 9var_dump(is_valid_japanese($str)); // bool(true) 10 11mb_substitute_character("none"); 12$str = mb_convert_encoding($str, "SJIS-win", "UTF-8"); 13 14var_dump(strlen($str)); // int(0) .... 漢字だが CP932 に変換できない
Unicode 限定であれば特に問題無いです。が、第一・第二水準以外は含めたくない、とかであれば、次のように適当なエンコーディングに変換できるかで確認すると良いかもしれません(その場合、正規表現の部分はもっとマイルドでも良いです)。
lang
1<?php 2$str = "丆"; 3 4function is_valid_japanese($str) 5{ 6 $tmp = mb_convert_encoding($str, 'ISO-2022-JP', 'UTF-8'); 7 $tmp = mb_convert_encoding($tmp, 'UTF-8', 'ISO-2022-JP'); 8 9 if ($tmp !== $str) { 10 return false; 11 } 12 13 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 14} 15 16var_dump(is_valid_japanese($str)); // bool(false) 17 18mb_substitute_character("none"); 19$str = mb_convert_encoding($str, "SJIS-win", "UTF-8"); 20var_dump(strlen($str)); // int(0)
投稿2014/12/28 00:40
総合スコア4514
0
ベストアンサー
TRY PHP!で紹介されている正規表現はかなり煩雑で、個人的には採用したくないものです。以下の問題点を抱えています。
-
文字コードの範囲指定に漏れがあります。定義されるべき範囲はプログラマの意図によって異なりますが、少なくとも私の判断では全てをカバーしきれていないことになります。
-
u
修飾子は不正なUTF-8シーケンスが含まれているときにpreg_match
関数にFALSE
を返させる特性を持っていますが、このコードは一切このことを考慮していません。不正なUTF-8シーケンスを混ぜ込んだ文字列を判定したときに意図しない動作になります。以下のコードを実行すると[漢字]は、すべて ひらがな と カタカナ です。
と出力されるでしょう。
lang
1$checkStr = "漢字\xff\xff\xff"; 2if (preg_match('/[^ぁ-んーァ-ヴー]/u', $checkStr)){ 3 echo '['.$checkStr.'] の中に ひらがな と カタカナ でない文字が含まれています。<br>'; 4} else { 5 echo '['.$checkStr.'] は、すべて ひらがな と カタカナ です。<br>'; 6}
範囲指定に関してはPentan.infoで紹介されているものをおすすめしておきます。**「想定していないものを探す」のではなく、「最初から最後まで想定しているものだけで構成されているか調べる」**という書き方になっていることに注目してください。こう書けば先ほどのu
修飾子に関する問題も解消出来ます。
lang
1function is_valid_japanese($str) { 2 return (bool)preg_match('/\A[.ぁ-ゞァ-ヾ一-龥朗-鶴a-z0-9-]*+\z/ui', $str); 3}
以下補足
-
この関数は空文字列を許可しています。空文字列を許可しない場合は、
*+
を++
に変更してください。 -
^``$
の代わりに\A``\z
、*``+
の代わりに*+``++
を採用している理由に関してはこちらを参照してください。
投稿2014/12/27 10:35
総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。