SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【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関数は高速なようです。

関連するメモ

コメント