3

Javascriptで正規表現を使用してユーザーエージェント文字列をスニッフィングしています。以下にいくつかの擬似コードを示します。

is_not_tablet_bool = /android.+mobile/i.test(navigator.userAgent.toLowerCase());
switch(true)
{
     case (is_not_tablet_bool):
         return true;
     break;
}

上記の反対に近い何かをする正規表現を作成しようとしています。

  1. 'android'キーワードが文字列に含まれていることを確認し、同時に
  2. 'mobile'キーワードが文字列に含まれていないことを確認してください

期待される支援に感謝します。

4

2 に答える 2

6

ネガティブな先読み

正規表現には、先読み部分をキャプチャせずに正規表現の文字列と一致する負の先読みと呼ばれる構造があります。

正規表現は次のように記述する必要があります。

/android(?!.*mobile)/i

これは、大文字と小文字が無視された単語mobileが後に続く単語androidを含むすべての文字列に一致します。これは、通話を削除できることも意味します。toLowerCase

追加:ネガティブルックビハインド

androidという単語が含まれているがモバイルがない(前または後の)文字列のみを一致させる必要がある場合は、負の先読みと後読みの組み合わせで問題ありません。

/(?<!mobile.*)android(?!.*mobile)/i

しかし、問題は、Javascriptがネガティブルックビハインドをサポートしていないことです。したがって、その状況を判断するのに役立つ別のトリックを採用する必要があります。

以下が最も興味深い(そして最後の1つが役立つ)と思われるいくつかの可能性があります。

  1. 後で失敗する一致する負の文字列を置き換えます。

    var nav = navigator.userAgent.replace(/mobile.*android/, "fail" );
    return /android(?!.*mobile)/i.test(nav);
    
  2. 2つの先読みを使用します。1つは通常の文字列に、もう1つは逆にされた正規表現を持ちながら、次のようになります。

    var nav = navigator.userAgent;
    var after = /android(?!.*mobile)/i.test(nav);
    var before = /diordna(?!.*elibom)/i.test(nav.split("").reverse().join(""));
    return before && after;
    
  3. シンプルさが鍵となります。2つの単純な正規表現でもうまくいきます。

    var nav = navigator.userAgent;
    return /android/i.test(nav) && !/mobile/i.test(nav);
    

注:コードが実際のコードであるかどうかはわかりません。実際のコードである場合は、 switch(true) ステートメントの使用を再検討し、単に。に置き換えること
return is_not_tablet_bool;を強くお勧めします。

于 2012-11-19T17:30:54.777 に答える
0

正規表現を使用すると、この作業が簡単になるとは思いません。String.indexOf(...)次のメソッドを使用して、これらの文字列の包含と除外を確認するだけです。

function isNotAndroidMobile(userAgentString) {
  var ua = userAgentString.toLowerCase();
  return (ua.indexOf('android')>=0) && (ua.indexOf('mobile')===-1);
}
于 2012-11-19T17:51:12.323 に答える