Regexp, который соответствует пользовательским агентам браузеров конечных пользователей, но не с искателями с точностью> 90%

Я пытаюсь построить регулярное выражение, которое будет оценивать значение true для User-Agent: s "браузеров, перемещаемых людьми", но false для ботов. Излишне говорить, что совпадение не будет точным, но если все будет правильно, скажем, в 90% случаев это более чем достаточно.

До сих пор мой подход нацелен на строку User-Agent пяти основных настольных браузеров (MSIE, Firefox, Chrome, Safari, Opera). В частности, я хочу, чтобы regexp NOT соответствовал, если пользовательский агент является ботом (робот Googlebot, msnbot и т.д.).

В настоящее время я использую следующее regexp, которое, как представляется, достигает желаемой точности:

^(Mozilla.*(Gecko|KHTML|MSIE|Presto|Trident)|Opera).*$

Я наблюдал небольшое количество ложных негативов, которые в основном являются мобильными браузерами. Исключения составляют все:

(BlackBerry|HTC|LG|MOT|Nokia|NOKIAN|PLAYSTATION|PSP|SAMSUNG|SonyEricsson)

Мой вопрос: Учитывая желаемый уровень точности, как бы вы улучшили регулярное выражение? Можете ли вы представить какие-либо серьезные ложные срабатывания или ложные отрицания для данного регулярного выражения?

Обратите внимание, что вопрос касается соответствия User-Agent на основе regexp. Существует множество других подходов к решению этой проблемы, но это выходит за рамки этого вопроса.

Ответ 1

Многие искатели не отправляют заголовок Accept-Language, а AFAIK - все браузеры. Вы можете объединить эту информацию с вашим регулярным выражением, чтобы получить более точные результаты.

Ответ 2

Вы можете создать черный список, проверив, какие пользовательские агенты получают доступ к файлу robots.txt.

Ответ 3

Я бы предпочел использовать противоположное, наличие шаблона для ботов намного проще

лично я использую следующее регулярное выражение

/bot\b|index|spider|crawl|wget|slurp|Mediapartners-Google/i