Текст поисковых запросов из $_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... Каюсь, грешен! Делал давно, и аляповато, а переделать теперь все руки не доходят.

Теги: php, regexp

Комментарии(1):

rss-лента

Добавлено: 2008-07-18 21:27:13, Bolzamo

PS. Вы, наверное, заметили, что мой блог работает ни разу не на UTF-8, а на cp1251... Каюсь, грешен! Делал давно, и аляповато, а переделать теперь все руки не доходят.
Исправил! Теперь сайт работает на UTF-8.
Кроме того, я подправил верстку, и теперь у меня валидный HTML 4.01 Transitional и CSS 2.1
Также оптимизировал dom-структуру. Теперь контент грузится быстрее, а блоки второстепенной важности - в последнюю очередь.

Добавить комментарий

Ваше имя:*
Ваш email:*(не публикуется)
Ваш сайт:
Ваш комментарий:*

Переносы строк и url-адреса преобразуются автоматически, не забудьте отделить их пробелами. html и bb-коды не поддерживаются.