シェアする

  • このエントリーをはてなブックマークに追加

[PHP][疑問]ある文字列が、複数のキーワードのうち一つでもマッチするか判定する方法について

small_318947873

表題がややこしくてすみません。

たとえば、$_SERVER[‘HTTP_USER_AGENT’]で取得できるユーザエージェントに、配列で渡す文字列が一つでも含まれていればtrue,そうでなければfalseを返す関数を作るとしたら、どうするのが効率的でしょうか?

// クローラーかどうかを判定する関数
function is_clawler($ua = null) {
	if (empty($ua)) {
		$ua = $_SERVER['HTTP_USER_AGENT'];
	}
	$crawlers = array(
		"Googlebot",		// google
		"Baiduspider",		// Baidu
		"Hatena",		// Hatena
		"Yahoo",		// Yahoo
		"FreeNutch",		// FreeNutch
	);
	foreach ($crawlers as $keyword) {
		if (stripos($ua, $keyword) !== false) {
			return true;
		}
	}
	return false;
}

こんな感じの処理を書いたんですが、どうも美しくありませんよね?

正規表現をつかって書くと

// クローラーかどうかを判定する関数
function is_clawler($ua = null) {
	if (empty($ua)) {
		$ua = $_SERVER['HTTP_USER_AGENT'];
	}
	$crawlers = array(
		"Googlebot",		// google
		"Baiduspider",		// Baidu
		"Hatena",		// Hatena
		"Yahoo",		// Yahoo
		"FreeNutch",		// FreeNutch
	);
	$ua = env("HTTP_USER_AGENT");
	$crawlers = implode("|", $crawlers);
	return ereg($crawlers, $ua);
}

こんな風にも書けますが、ベンチマークを取ってみると正規表現のほうが遅いようです。

もっとシンプルで、効率のいい方法があるよ!って方はぜひ教えてくださいね。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする