PHPで全角のみ入力を許可するバリデーション

PHPで全角のみ入力を許可するバリデーション

PHPで全角のみ入力を許可するバリデーションをする必要がありました
ググってもいま一つ新しい記事もなくなんだか怪しい。。
という訳でまとめて検証してみました

調査

・前提条件として文字コードはUTF-8です
・検索して引っかかったのを抽出しています

全角入力チェック|武蔵小杉で働くギークのブログ ~ノマドワーキングに憧れて~

$text = "文字列です。";

$len = strlen($text);
// UTF-8の場合は全角を3文字カウントするので「* 3」にする
$mblen = mb_strlen($text, "UTF-8") * 3;
// UTF-8でない時は↓のようにするらしい
// $mblen = mb_strlen($text, [文字コード]) * 2;

if($len != $mblen) {
    echo "半角のみ。";
} else {
    echo "全角のみ。";
}

正規表現で、文字列は全て全角文字か?のチェック(PHP編): プログラマーの雑記帳

//全て全角文字か?
//PHPの正規表現で、渡された文字列が全て全角文字かチェックします。(UTF-8向け) 
//PHP 正規表現 全角文字 UTF8
$str = "ABCDEFXYZあいうえおカキクケコ@!+*_";
if (!preg_match("/(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])|[\x20-\x7E]/", $str)) {
    echo "すべて全角である"."
\n"; } else { echo "すべて全角ではない"."
\n"; } //↓ //"すべて全角である"

PHP での「全角のみ」チェックはこれでいいんじゃないの – 頭ん中

2012/03/30 追記

※注意
UTF-8の場合php.iniで
mbstring.internal_encoding = UTF8
を設定するか、第二引数にUTF8と入れないと正しい動作をしません

検証

PHPUnitでテストしてみます

テストの条件

1.すべて全角
2.すべて半角
3.全角半角まじり
4.半角カナまじり

/**
 * @assert ('文字列です。') === true
 * @assert ('abcd1234+:;!') === false
 * @assert ('全角abcd') === false
 * @assert ('半角カナ') === false
 */

結果

phpunit --colors --bootstrap isZen.php isZen 
PHPUnit 3.6.10 by Sebastian Bergmann.

...F........

Time: 0 seconds, Memory: 4.50Mb

There were 2 failures:

1) isZenTest::testIs_zen_strlen4
Failed asserting that true matches expected false.

FAILURES!
Tests: 12, Assertions: 12, Failures: 1.

2番目と3番目のものだけが正しいということになりました

テストと、関数はgithubに上げておきました
つっこみお待ちしています
nobuhiko/isZen · GitHub