【php】文字種チェック高速化
問題
phpで文字の種類をチェックするときって、正規表現を使うぐらいしかないですか?
答え
正規表現は融通が利いて汎用的で便利ですよね。
基本的な正規表現なら十分高速に動作します。
正規表現以外の文字タイプチェックにはCtype関数があります。
ctype 関数は、正規表現よりもつねに好ましく、さらに “str_” および “is_” のような いくつかの等価な関数よりも好ましいことに注意してください。 これは、ctype 関数がネーティブな C ライブラリを使用しており、処理が著しく 高速であるためです。
https://www.php.net/manual/ja/intro.ctype.php
ctype_alnum — 英数字かどうかを調べる
ctype_alpha — 英字かどうかを調べる
ctype_cntrl — 制御文字かどうかを調べる
ctype_digit — 数字かどうかを調べる
ctype_graph — 空白以外の印字可能な文字かどうかを調べる
ctype_lower — 小文字かどうかを調べる
ctype_print — 印字可能な文字かどうかを調べる
ctype_punct — 空白、英数字以外の出力可能な文字かどうかを調べる
ctype_space — 空白文字かどうか調べる
ctype_upper — 大文字かどうか調べる
ctype_xdigit — 16 進数を表す文字かどうかを調べる
だそうです。
検証
英数字かどうかのチェックを何度も実行して速度を確認します。
ctype_alnum
<?php for ($i = 0; $i < 10000000; ++$i) { ctype_alnum('123abc'); }
$ time php test.php
real 0m0.282s
user 0m0.219s
sys 0m0.031s
preg_match
<?php for ($i = 0; $i < 10000000; ++$i) { preg_match('/^[a-z]$/', '123abc'); }
$ time php test.php
real 0m0.998s
user 0m0.922s
sys 0m0.078s
結果
3倍違うとはいえ、1000万回ループして0.6秒差です。
わかりやすいほうを選択するのがよさそうに思いますが、確かにCtype関数は高速なようです。
コメント