先日PHPでアップロードしたファイルの拡張子を判定する場面があったので。
PHPで拡張子の判定をするときの方法2つをご紹介します。
- 正規表現を使う
- PHPの文字列関数を駆使する
今回はこの2つの方法を紹介します。
正規表現を使う方法
//○○○.zipを判定 preg_match('/\.(zip)$/i', 'aaa.zip'); //return 1; preg_match('/\.(zip)$/i', 'aaa.zipa'); //return 0; preg_match('/\.(zip)$/i', 'aaazip'); //return 0; //○○○.zipと△△△.lzhを判定 preg_match('/\.(lzh|zip)$/i', 'aaa.zip'); //return 1; preg_match('/\.(lzh|zip)$/i', 'aaa.lzh'); //return 1; preg_match('/\.(lzh|zip)$/i', '.lzh'); //return 1;
前者は末尾にある「.zip」を判定し、後者は末尾にある「.zip」または「.lzh」を判定します。
正規表現なので安心して使える反面、速度が落ちます。
これについては後述します。
文字列関数を駆使する方法
//○○○.zipを判定 strrchr('aaa.zip', '.') === '.zip'; //return true; strrchr('aaa.zip.aaa', '.') === '.zip'; //return false; strrchr('aaa.zipaaaaa', '.') === '.zip'; //return false;
PHPのstrrchr関数で「.」以降の文字列を取得して拡張子の文字列と比較します。
こちらは一度文字列をstrrchr関数で取得→比較と、処理的に一手間必要です。
また、zipとlzhを同時に比較したい!という時は、||を挟んで同じ処理をもう一度書く必要があります。
速度比較
はい、いつもの速度計測やってみまーす。
基本的に正規表現は処理が重くなりがちですが、実際どれほど差が出るのでしょうか。
<?php //計測回数 define('COUNT',10); //試行回数 define('TEST_COUNT',100000); //小数点桁数 define('DECIMAL_DIGITS',10); //平均値 $average = 0.0; $arr = array('','',''); for($i = 0; $i < COUNT; $i++) { $start = microtime(true); for($j = 0; $j < TEST_COUNT; $j++) { //処理 } $end = microtime(true); $result = $end - $start; echo number_format($result,DECIMAL_DIGITS). "秒<br>"; $average += $result; } $average = number_format($average/COUNT,DECIMAL_DIGITS); echo 'avarage:'. $average.'秒<br>';
正規表現の場合
preg_match('/\.(zip)$/i', 'aaa.zip');
avarage:0.4553147316秒
文字列関数の場合
strrchr('aaa.zip', '.') === '.zip';
avarage:0.1603861570秒
一目瞭然ですね。。正規表現よりも倍以上速いです。
まとめると
- 一度に複数の拡張子比較をする、コードを削減する場合は正規表現
- ループなどの負荷がかかりがちな処理では文字列関数
という使い分けで問題ないと思います。
コメント