Текст поисковых запросов из $_SERVER['HTTP_REFERER']
Итак, стоит задача получения текстов поисковых запросов из URL источника перехода. Это может быть полезным при разборе статистики посещаемости сайта. Напоминаю, что источник перехода на страницу можно брать из менеменной $_SERVER['HTTP_REFERER'].
От простого к сложному, затем к разумному, пришел к такой реализации:
<?
function searchstr($str,$separator){
return rawurldecode(preg_replace('~^http://(www\.)?(search\.live\.com|google\.(com|ru|com\.ua){1}|rambler\.ru|yandex\.ru|search\.yahoo\.com){1}/(.*)(&|\?)(q|words|text|p)=([^&]+)(.*)$~i','$2'.$separator.'$7',$str));
}
?>
Нехилый такой получился экпрешн :) Умеет парсить URL`ы от Google, Rambler, Яndex, MSN LiveSearch, Yahoo
Но на практике, пользы от него мало, так как некоторые поисковики выводят информацию не в UTF-8. Пальцем можно ткнуть в тот же Rambler, который скармливает нам cp1251. В таком случае, нужно чуточку расширить возможности нашей функции проверкой кодировки. Не станем изобретать велосипед, а возьмем готовое решение отсюда. Вписываем в наш скрипт функцию is_utf8():
<?
function is_utf8(&$data, $is_strict = true)
{
if (is_array($data))
{
foreach ($data as $k => &$v) if (! is_utf8($v, $is_strict)) return false;
return true;
}
elseif (is_string($data))
{
/*
Рег. выражения имеют внутренние ограничения на длину повторов шаблонов поиска *, +, {x,y}
равное 65536, поэтому используем preg_replace() вместо preg_match()
*/
$result = $is_strict ?
preg_replace('/(?>[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*
/sx', '', $data) :
#это рег. выражение проверяет более широкий диапазон ASCII [\x00-\x7E]
preg_replace('/.*/su', '', $data);
if (function_exists('preg_last_error'))
{
if (preg_last_error() === PREG_NO_ERROR) return strlen($result) === 0;
if (preg_last_error() === PREG_BAD_UTF8_ERROR) return false;
}
}
elseif (is_scalar($data) || is_null($data)) return true; #~ null, integer, float, boolean
#~ object or resource
trigger_error('Scalar, null or array type expected, ' . gettype($data) . ' given ', E_USER_WARNING);
return false;
}
function searchstr($str,$separator){
$str= rawurldecode(preg_replace('~^http://(www\.)?(search\.live\.com|google\.(com|ru|com\.ua){1}|rambler\.ru|yandex\.ru|search\.yahoo\.com){1}/(.*)(&|\?)(q|words|text|p)=([^&]+)(.*)$~i','$2'.$separator.'$7',$str));
return is_utf8($str)?$str:iconv('cp1251','UTF-8',$str);
}
?>
Теперь, когда мы скармливаем этой функции адрес странички результатов поиска, она возвращает нам имя поисковика и запрос в кодировке UTF-8, разделенные строкой, указанной в параметре «$separator»
Пример использования:
<?
echo searchstr('http://www.google.ru/search?complete=1&hl=ru&newwindow=1&q=%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F+joomla+1.5&lr=&aq=f',': ');
?>
Выводит на экран:
google.ru: структура+модуля+joomla+1.5
PS. Вы, наверное, заметили, что мой блог работает ни разу не на UTF-8, а на cp1251... Каюсь, грешен! Делал давно, и аляповато, а переделать теперь все руки не доходят.
- Статьи схожей тематики:

Комментарии(3):
rss-лентаДобавлено: 2009-03-21 01:51:54, tetra
Добавлено: 2009-03-21 16:34:06, Bolzamo
Добавлено: 2009-05-18 21:58:51, Ольга