Регулярное выражение для обнаружения Internet Explorer 11

Я использую это preg_match строка

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

определить IE11, чтобы я мог включить режим планшета для него. Однако он возвращает «неизвестный разделитель 7».

Как я могу сделать это без PHP жаловаться на меня?

9

Решение

Это действительно регулярное выражение или просто литеральная строка? Если это просто строка, вы можете использовать StrPos функция вместо

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

Если это регулярное выражение, вы должны экранировать специальные символы, такие как / а также .

РЕДАКТИРОВАТЬ:

Вы можете видеть в комментариях к этому ответу, что код не обнаруживает IE 11 должным образом во всех случаях. Я на самом деле не проверял его на соответствие, я просто изменил код создателя вопроса, чтобы использовать strpos вместо preg_match потому что он был применен неправильно.

Если вы хотите надежный способ обнаружить IE 11, пожалуйста, посмотрите на другие ответы.

13

Другие решения

Строка user-agent может по-разному передаваться на разных платформах или устройствах. Взгляните на это: http://msdn.microsoft.com/en-au/library/ie/hh869301(v=vs.85).aspx

Только что нашел следующий строковый шаблон, охватывающий большинство пользовательских агентов, как сообщается для IE11 или выше (он может не иметь места, если Microsoft снова изменит свою строку User-agent для более новой версии 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

Я думаю, что это должно быть

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

потому что иногда вы можете увидеть пользовательский агент, как этот

Mozilla / 5.0 (Windows NT 6.3; WOW64; Trident / 7.0; ASU2JS; rv: 11.0), как Gecko

5

IE11 имеет сенсорные версии и не сенсорные версии, это означает, что ответ Гильерма Сена не будет работать для сенсорных устройств.

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» и номером ревизии можно добавить любое количество параметров.

Точно так же, если вы хотите проверить, на связи ли они, просто сделайте strpos для «Touch;».

2

Всегда полезно использовать другой символ, которого нет в строке регулярного выражения, поэтому вам не нужно экранировать строку и ее легче читать для длинных. Так что вы можете использовать ~ для разделителя:

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

Вы должны избежать среднего слэша / работать в регулярном выражении, которое заключено в slahses:

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

/ после 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

Я бы использовал проект browscap чтобы получить эти данные сам. Это быстрее и надежнее

0
По вопросам рекламы [email protected]