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
正規表現の先読み・後読みを極める!

次へ 投稿

前へ 投稿

返信する

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

© 2024 planet-green.com

テーマの著者 Anders Norén


planet-green.com