Согласно этой теме, и специально этот пост: https://stackoverflow.com/a/6595973/1125465 , Microsoft, как всегда показывает. Размер пользовательского агента может быть действительно, действительно огромным.
Я работаю над небольшой библиотекой посетителей в php, и я хочу хранить информацию агента пользователя. Я не могу определить тип и длину данных.
Поэтому мой вопрос: есть ли у вас какие-либо идеи, как сократить пользовательский агент, до какого-то «нормального» размера? (например, 256 символов) .
Примечание. Разработчики используют пользовательские агенты для обнаружения браузера пользователя и операционных систем. Итак, согласно связанному примеру, все глупые числа из M $ просто … Просто. Как всегда, на нервы. Поэтому идея состоит в том, чтобы сделать функцию, которая сокращает строку пользовательского агента, но не теряет важную информацию.
Я считаю, что такая функция должна:
Дополнительное примечание: я знаю, что я могу сделать функцию, которая получает браузер, и тип ОС от пользовательского агента, и сохранять только эти значения. Но, как всегда, такие функции имеют жестко заданные имена, и если браузер не распознается, он возвращает, например, «Unrecognized browser». Поэтому в будущем все должны помнить об обновлении этих функций. И если мы сохраним сокращенный пользовательский агент, информация isn 't потерян (поскольку только скрипт, который читает базу данных, должен иметь новую систему распознавания). Но записи в базе данных являются надежными и последовательными, как и должно быть.
ОБНОВЛЕНИЕ: поскольку должен быть какой-то код, и есть проблема с идеей, а не проблема с существующим кодом, я напишу минимальный код, который я написал до сих пор;):
<?php function shorten($useragent, $maxsize = 256) { $shorten = $useragent; ... // ? $shorten = substr($shorten, 0, $maxsize); // the "last hope" cut return $shorten; } echo shorten($_SERVER['HTTP_USER_AGENT']); ?>
Для строк User-Agent нет правил, поэтому нет возможности создать абсолютно правильный и перспективный парсер. Однако существует общая картина:
User-Agent: <engine-string> <engine-string> ...
Где engine-string
имеет форму:
<agent-name> (<comment>; <comment>; ...)
Каждая строка двигателя (я просто назвал ее, что, по моему мнению, это может быть неверно) может иметь или не иметь комментариев.
Например:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲ AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲ Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(Это единственная строка, я просто разбил ее на строки.) Кажется, всякий раз, когда кто-то делает вилку браузера, они просто добавляют свою вещь до конца. Итак, у нас есть абстрактный абстрактный браузер «Mozilla» (наследие «Первой Браузерной войны»), которая думает, что это на iPhone. Затем мы видим, что есть WebKit (который помнит, что он родился как KHTML некоторое время назад). Затем есть модификация версии / 6.0, которая затем была изменена в Mobile / 10A5376e, которая стала Safari / 8536.25, что, в конце концов, раскрывает секрет, что это фактически мобильный бот Google.
Другой пример:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲ InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲ .NET CLR 3.5.30729; .NET CLR 1.1.4322)
Это единственный движок, но в скобках можно многое сказать.
Таким образом, общее наблюдение:
Имея это в виду, моя идея состояла бы в том, чтобы разобрать строку в этот движок и прочесть токены, а затем из каждой секции двигателя выбросить комментарии, начиная, скажем, с пятого. Затем, если этого еще недостаточно, отбросьте секции двигателей, начиная со второго (первый часто является абстрактным «Mozilla», но часто имеет полезные комментарии, а иногда и на самом деле это что-то конкретное, особенно для веб-сканеров).
При разборе мы должны учитывать, что иногда могут быть строки, не соответствующие этому формату. Они могут быть сохранены в файл журнала для последующей проверки, а затем просто вырезаны до необходимой длины, чтобы они соответствовали базе данных.