Я использую это preg_match
строка
preg_match('/Trident/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]
определить IE11, чтобы я мог включить режим планшета для него. Однако он возвращает «неизвестный разделитель 7».
Как я могу сделать это без PHP жаловаться на меня?
Это действительно регулярное выражение или просто литеральная строка? Если это просто строка, вы можете использовать StrPos функция вместо
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false) {
// your code
}
Если это регулярное выражение, вы должны экранировать специальные символы, такие как /
а также .
РЕДАКТИРОВАТЬ:
Вы можете видеть в комментариях к этому ответу, что код не обнаруживает IE 11 должным образом во всех случаях. Я на самом деле не проверял его на соответствие, я просто изменил код создателя вопроса, чтобы использовать strpos
вместо preg_match
потому что он был применен неправильно.
Если вы хотите надежный способ обнаружить IE 11, пожалуйста, посмотрите на другие ответы.
Строка 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.';
}
Я думаю, что это должно быть
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
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;».
Всегда полезно использовать другой символ, которого нет в строке регулярного выражения, поэтому вам не нужно экранировать строку и ее легче читать для длинных. Так что вы можете использовать ~
для разделителя:
preg_match('~Trident/7.0; rv:11.0~',$_SERVER["HTTP_USER_AGENT"])
Другая идея заключается в использовании stristr функция, чтобы увидеть, если строка встречается в другом
stristr($_SERVER['HTTP_USER_AGENT'],'Trident/7.0; rv:11.0')
Вы должны избежать среднего слэша /
работать в регулярном выражении, которое заключено в 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'] );
/
после 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/')) {
Я бы использовал проект browscap чтобы получить эти данные сам. Это быстрее и надежнее