LINUX.ORG.RU

[Быдлокод] Мой парсер user agent... помогите оптимизировать @ привести в божеский вид

 


0

1

Решил написать свой парсер user agent, который работал бы наверняка и определял не только дефолтные браузеры/системы.

function find ($needles, $haystack) {
	foreach ($needles as $i)
		foreach ($haystack as $j)
			if (strpos ($j, $i) !== false)
				return $j;
	return false;
}
function cut ($str, $s) {
	foreach ($s as $i) {
		$p = strpos ($str, $i);
		if ($p !== false)
			return substr ($str, 0, $p);
	}
	return false;
}

preg_match_all ("/([\w\s]+)\/([\d\.]+)(?: \(([^\(\)]*)\))?( |$)/", $_SERVER['HTTP_USER_AGENT'], $agent);

for ($i = count ($agent[1]) - 1; $i >= 0; $i--)
	if ($agent[1][$i] == "Version") $vkey = $i;
	elseif ($i != 1) break;
if ($agent[1][$i] == "Safari" and $agent[1][$i - 1] != "Version" and $i != 2)
	$i--;

if (!$vkey) $vkey = array_search ($browser, $agent[1]);
$browser = $agent[1][$i]." ".substr ($agent[2][$vkey], 0, strpos ($agent[2][$vkey], "."));

$system = explode ("; ", $agent[3][0]);

$i = find (array ("MSIE", "Opera Mobi", "Opera Mini", "Konqueror"), $system);
if ($i !== false) $browser = cut ($i, array ("/", "."));

$os = find (array ("Android", "Linux", "Windows", "Mac OS X", "BSD"), $system);
if (!isset ($os) or $os === false) $os = $system[2];
$os = cut ($os, array ("/", ".", "_", " ("));
Капитан мне говорит, что получился лютый, бешеный быдлокод. И вот даже не знаю что делать и с чего начать...

function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }

$time_start = getmicrotime();

<быдлокод>

$time_end = getmicrotime(); $time = $time_end - $time_start; echo «Скрипт сгенерирован за $time секунды»;

И дальше оптимизировать по времени выполнения (или не трогать, если быстро работает).

anonymous
()

Что бросается в глаза сразу (не вникая в суть дела):
Всё что в кавычках нужно запихать в константы/конфиг.
Куча 'magic numbers' - тоже избавляться.

invy ★★★★★
()
Ответ на: комментарий от moscwich

А «умный» парсинг UA невозможен. Там нет строгих формальных правил и движки часто не имеют отношения к браузерам. Так что — только на наборах правил.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А ты мой код почитай. Есть закономерности на 95% случаев + упомянуты в сабжевом коде популярные исключения.

moscwich
() автор топика
Ответ на: комментарий от moscwich

Есть закономерности на 95% случаев

Мой вариант покрывает куда более, чем 95% (я бы сказал, 99.99% хитов) и может логгировать непонятное :)

Ну и плюс определение некоторых девайсов, но это обычно индивидуально и по заказу пользователей форума :)

KRoN73 ★★★★★
()
Ответ на: комментарий от tensai_cirno

Твой пример мой скрипт парсит нормально.

moscwich
() автор топика
Ответ на: комментарий от moscwich

Количество случаев != количество пользователей.

Ну, смотря где. Для форумов, например, блогов и т.п. мест, где нужно отображать UA пользователя, именно что равно :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.