2011-12-16 12 views
1

私はこれを行う方法を理解しようとしています。私は "モバイル"と "サファリ"が存在するかどうかを確認するために正規表現チェックを行っていますので、iOSかどうかを知ることができますが、Androidはモバイル版Safariを一部のバージョンでも使用しています。だから私は持っていた:それに私はこれをチェックするjavascriptの正規表現

(?=.*Mobile)(?=.*Safari).*

しかし、今、私は追加するにはどうすればよい「という文字列でのAndroidせずに」?私は "続かないで"しようとしました(?!.*Android)(?=.*Mobile)(?=.*Safari).*しかし、それは私が欲しいものではないものが見つかるまではまだ一致しています。

+3

1つの正規表現を使用して複数のものが存在するかどうかを確認することはできません。あなたは正規表現を主張する場合は、複数の正規表現を使用し、それらのロジックを組み合わせることができます。 – jfriend00

+0

そして、正規表現が過度である点に確実に到達します:) – ThiefMaster

+0

こんにちはオスカー、あなたが考えていた表現について正確には何が働いていませんか?それは "モバイルサファリアンドロイド"などの文字列と一致しません、それはあなたが欲しいものではありませんか? – zx81

答えて

3

なぜ正規表現を使用しますか?

abにあるかどうかをテストするには、b.indexOf(a) != -1を使用してください。
aではないことを確認するには、bでない場合は、b.indexOf(a) == -1を使用してください。

だからあなたのコードは次のようになります。

もちろん ​​

あなたが実際に特定の機能があるかどうかを確認する必要がある場合、それはあなたがライブラリをスニッフィング既存のブラウザを使用している場合はるかに良い...かでしょう特定のブラウザまたはブラウザのバージョンを確認する代わりに、その機能をテストするために使用可能なコードを使用します。

+0

ライブラリ全体を使ってiOSやAndroidまたはWindows Phone 7をチェックしたくない。私たちの社内JSライブラリはすでに大規模で、IE7がクロールしているだけなので、ライブラリを投げるのは好きではない。さまざまな 'indexOf'呼び出しを含む複数の条件文を持っていますが、シンプルな' ua.match(/(?=.*.Mobile)(?=。* Safari)。* /) 'また高速です –

+0

正規表現では行えないはずのものに対して正規表現を誤って使用することはまったく問題ありません。それに加えて、 'indexOf'チェックはおそらくもっと速いでしょう。 – ThiefMaster

+0

また、JS機能をチェックしていない、CSSベースの機能を探している(これらの機能と他の機能との間の固定位置の違いなど) –

2

簡単に行われます。アンカーと否定的な先読みを追加してください:

re = /^(?=.*Mobile)(?=.*Safari)(?!.*Android).*/i; 
+0

行頭の '^'がこれに相違をもたらす理由を説明してください。 – nnnnnn

+0

@nnnnnn - はい。 subject string: '' Android Mobile Safari ''' ^'を除いた式は '' Android''の最初のAの後のすべての位置で 'Mobile'のMの直前の位置まで正常に一致します。 '^'アンカーを追加すると、3つの先読みすべてが対象文字列の先頭に_only_と一致するように強制されます。 – ridgerunner

+0

ああ。クール、ありがとう。分かったと思います。 – nnnnnn