planet-green.com

正規表現でユーザーエージェントからSafariを判別する方法



ユーザーエージェント(以下、UA)からSafariを識別する必要があったのですが、
普通に “Safari” の文字列だけを検出しようとすると、Chromeも引っかかってしまいます。
何故ならChromeのUAにも次のように Safari の文字列が含まれているからです。

Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36

そこで、Safariだけを判別したい場合に正規表現一発だけで何とか出来ないかと、ネットで調べて参考にしたのが次のパターン。PHPのコードです。

$ua = $_SERVER['HTTP_USER_AGENT'];
if ( preg_match("/^(?!.*Chrome).+(Safari).+$/i", $ua) )
{
    ....
}

ところが、UAに”Safari”が含まれるのはChromeだけではなく、AppleWebKitを利用している他のブラウザだと、この正規表現をすり抜けてしまいます。
例えば、Andoroid標準ブラウザのUAは次のようになっています。

Mozilla/5.0 (Linux; U; Android 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

他にも、BlackBerryやSymbianも同様になっています。
そこで次に考えた力業(ちからわざ)がこれ。

preg_match("/^.+(Windows|Macintosh|iPhone|iPad)(?!.*Chrome).+(Safari).+$/i", $ua)

(Windowsも含まれてるのは、Windows版Safariも存在するので)

それにしても、正規表現を何年も使っていながら、「否定的先読み」なんて機能を始めてしりました。

もうちょっとスマートなやり方があるように思うので、誰か教えてください!

【参考】
Regex Negative Lookahead for Chrome & Safari
正規表現の先読み・後読みを極める!

コメントを残す

メールアドレスが公開されることはありません。

※ URLを含んだコメントは承認後に表示されます。

* 画像に書かれている英数字を入力してください。