表題がややこしくてすみません。
たとえば、$_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);
}
こんな風にも書けますが、ベンチマークを取ってみると正規表現のほうが遅いようです。
もっとシンプルで、効率のいい方法があるよ!って方はぜひ教えてくださいね。
