2013-11-02 4 views
9

Я использую эту preg_match снабжать струной, тетивой и т.п. Регулярное выражение для обнаружения Internet Explorer 11

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

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

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

+2

Это просто говорит вам, что это IE11, а не планшет или даже устройство с сенсорным экраном. Скорее всего, на странице больше посетителей IE11, чем у пользователей планшета. Каковы последствия включения режима планшета для пользователя на рабочем столе без сенсорного экрана? –

+1

Удивленный никто не бил меня до этого, но, пожалуйста, не обнаруживайте браузер. Это очень плохая привычка иметь. Вместо этого я рекомендую вам попробовать гибкие методы проектирования и функции обнаружения для создания вашего приложения. FWIW Раньше я был в лагере посвященного веб-сайта для мобильных и настольных компьютеров. Но это быстро исчезает в массовом обслуживании и т. Д. Сначала запустите мобильный, а затем уменьшите масштаб. Это проще, чем вы думаете. –

+1

@ChrisLove, нет, потому что Google использует обнаружение браузера, поэтому msn и microsoft.com. Так почему я не должен? – ben

ответ

11

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

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

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

EDIT:

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

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

+0

Не соответствует моей строке IE: Windows NT 6.3; WOW64; Trident/7.0; ASU2JS; rv: 11.0 – Doug

+1

вот журнал доступа. вышеизложенное не работает. это взято из 11 запроса. '172.16.0.85 - - [30/Январь/2015: 16: 15: 01 +0000]" GET /wp-content/plugins/contact-form-7/includes/css/styles.css?ver=4.1 HTTP/1.1 "200 1103" http://website-dev.uk.aaa.com/ "" Mozilla/4.0 (совместимо; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5 .30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) "0/3500 ' – shorif2000

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']); 

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

+3

В тот момент, когда вы используете 'preg_quote' во всем регулярном выражении, вы должны понимать, что вам не нужно регулярное выражение! – lonesomeday

+0

@lonesomeday Eh, yes - good point – feeela

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/')) { 
1

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

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

Другая идея состоит в том, чтобы использовать stristr функцию, чтобы увидеть, если строка встречается еще в одном

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

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

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

1

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

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».

7

Строка пользовательского агента может сообщаться по-разному на разных платформах или устройствах. Взгляните на это: 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.'; 
} 
Смежные вопросы