このエントリーが役に立ったらシェアをお願いします!

[PHP]ファイルの拡張子判定をする方法 2パターン

このエントリーが役に立ったらシェアをお願いします!

先日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秒

一目瞭然ですね。。正規表現よりも倍以上速いです。

まとめると

  • 一度に複数の拡張子比較をする、コードを削減する場合は正規表現
  • ループなどの負荷がかかりがちな処理では文字列関数

という使い分けで問題ないと思います。

スポンサーリンク

このエントリーが役に立ったらシェアをお願いします!

1この記事を書いた人
ShoheiTai
フロントエンド志向のWebエンジニア。
HTML5やWeb高速化、SEO等のフロントエンド開発が大好物。
バックエンドではCakePHP,Wordpress開発を主戦場としています。
Web開発のスパイスファクトリー株式会社創業メンバー。

イケてないコード - Webエンジニアのブログの
最新情報をいいねしてチェックしよう!