ユーザーエージェント(以下、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
正規表現の先読み・後読みを極める!