web-dev-qa-db-ja.com

Internet Explorer11を検出するための正規表現

私はこれを使用していますpreg_match ストリング

preg_match('/Trident/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]

iE11を検出して、タブレットモードを有効にできるようにします。ただし、「不明な区切り文字7」が返されます。

PHP文句を言わずにこれを行うにはどうすればよいですか?

9
ben

これは本当に正規表現ですか、それとも単なるリテラル文字列ですか?文字列だけの場合は、代わりに strpos 関数を使用できます。

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false) {
    // your code
}

正規表現の場合は、/.などの特殊文字をエスケープする必要があります

編集:

この回答のコメントを見ると、コードがすべての場合にIE 11を正しく検出していないことがわかります。実際にテストしたのではなく、コードを調整しただけです。間違って適用されたため、preg_matchの代わりにstrposを使用する質問作成者の.

IE 11を検出するための信頼できる方法が必要な場合は、他の回答をご覧ください。

13
Guilherme Sehn

ユーザーエージェント文字列は、さまざまなプラットフォームまたはデバイス間で異なる方法で報告される場合があります。これを見てください: http://msdn.Microsoft.com/en-au/library/ie/hh869301(v = vs.85).aspx

IE11以降で報告されているほとんどのユーザーエージェントをカバーする次の文字列パターンが見つかりました(Microsoftが新しいバージョンのIEでユーザーエージェント文字列を再度変更した場合は当てはまらない可能性があります)。

if (preg_match("/(Trident\/(\d{2,}|7|8|9)(.*)rv:(\d{2,}))|(MSIE\ (\d{2,}|8|9)(.*)Tablet\ PC)|(Trident\/(\d{2,}|7|8|9))/", $_SERVER["HTTP_USER_AGENT"], $match) != 0) {
    print 'You are using IE11 or above.';
}
9
Ken Pega

私はそれがあるべきだと思います

if (preg_match("/Trident\/7.0;(.*)rv:11.0/", $_SERVER["HTTP_USER_AGENT"], $match) != 0) {}

時々あなたはこのようなユーザーエージェントを見ることができるので

GeckoのようなMozilla/5.0(Windows NT 6.3; WOW64; Trident/7.0; ASU2JS; rv:11.0)

6
Kubas

IE11にはタッチバージョンと非タッチバージョンがあります。これは、GuilhermeSehnの回答がタッチデバイスでは機能しないことを意味します。

if(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)

代わりに、これを使用してください:

if ( strpos($_SERVER['HTTP_USER_AGENT'], 'rv:11.0')     !== false
  && strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0;')!== false)
{
    echo "User is on IE11 touch / non-touch";
}

これは、「Trident」とリビジョン番号の間に任意の数のパラメーターを追加できるためです。

同様に、彼らが接触しているかどうかを確認したい場合は、「Touch;」のstrposを実行してください。

3
userqwert

正規表現文字列に含まれていない別の文字を使用することをお勧めします。これにより、文字列をエスケープする必要がなくなり、長い文字列でも読みやすくなります。したがって、区切り文字に~を使用できます。

preg_match('~Trident/7.0; rv:11.0~',$_SERVER["HTTP_USER_AGENT"])

別のアイデアは、 stristr 関数を使用して、別の文字列で文字列が発生するかどうかを確認することです。

stristr($_SERVER['HTTP_USER_AGENT'],'Trident/7.0; rv:11.0')
1
Can YILDIZ

スラッシュで囲まれた正規表現で作業するには、中央のスラッシュ_/_をエスケープする必要があります。

_preg_match( '/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'] );
_

preg_quote()を使用して、文字列内のすべての特殊文字をエスケープすることもできます。

_$regexp = sprintf( '/%s/', preg_quote( 'Trident/7.0; rv:11.0', '/' ) );
preg_match( $regexp, $_SERVER['HTTP_USER_AGENT'] );
_

http://www.php.net/manual/en/function.preg-quote.php

0
feeela

Tridentの後の/は、区切り文字として扱われます。あなたはそれを逃れることができます:

preg_match('/Trident\/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]

ただし、preg_matchを使用しない方がよいでしょう。必要ありません。あなたがしているのは、不変の部分文字列を探すことだけです。これは、 strpos で実行できます。

if (false !== strpos($_SERVER["HTTP_USER_AGENT"], '/Trident/7.0; rv:11.0/')) {
0
lonesomeday

browscap project を使用して、このデータを自分で取得します。より速く、より信頼性があります

0
Machavity