Разбор поисковой строки(решение)

imdem

Guest
Разбор поисковой строки(решение)

Собственно только вчера руки дошли до реализации задуманного - с подсказками , которые дали на этом же форуме.
В итоге получилась самодостаточная php-функция - может кому пригодится)
вызов чтото типа

$host_from=$_SERVER['HTTP_REFERER'];
$s_words=parseadr($host_from);

сама функция
function parseadr($stradr)
{
//это небольшая коррекция для одного из запросов яндекса -
//иногда проглатывается знак равно
$stradr=str_replace("=text%3D","=&text%3D",$stradr);

//описываем сигнатуры поисковиков - делается опытным путем)
//массив - поле poisk - это сигнатура поисковика
//поле nm_var - соответствующая каждому поисковику переменная с текстом запроса
//поле nm_kod - буква кодировки текста запроса. из проанализированных на моем сайте - только один из яндексов ходит с кои8 (код k)
$sign = array("poisk" => array('aport.ru','km.ru','msn.com','google','tut.by','yahoo.com','alltheweb.com','ualist.com','metabot.ru','mail.ru','yandsearch','rambler.ru','yandpage','yandbtm'),"nm_var" => array('r','sq','q','q','query','p','q','qry_str','st','q','text','words','text','text'), "nm_kod" =>array('w','w','w','w','w','w','w','w','w','w','w','w','k','w'));

//по умолчанию - кодировка виндузовая
$kod='w';


//ищем сигнатуру и опрелделяем имя переменной и кодировку
for ($i=0;$i<14;$i++)
{
if (strpos($stradr,$sign["poisk"][$i])>0)
{
$kod=$sign["nm_kod"][$i];
$nm_var=$sign["nm_var"][$i];
}
}

//обрабатываем поисковую строку - приводим выражения вида %25xx к виду %xx (нужно в одном единственном случае - когда в кодировке кои8 с яндекса) ...впрочем в остальных случаях это не мешает.

$stradr=preg_replace('/%(?:25)?([0-9a-f]{2})/sei','chr(hexdec("$1"))',$stradr);

//раскладываем строку по переменным
parse_str($stradr, &$arr);

//вынимаем значение нужной нам переменной
$stradr=$arr[$nm_var];

//и конвертируем в виндузовую кодировку
$stradr=convert_cyr_string ($stradr,$kod,"w");

//радуемся полученному результату
return $stradr;
}


Собственно остается добавлять сюда описания сигннатур других поисковиков и пользоваться)


Замечания и предложения по оптимизации приветствуются)))

-~{}~ 12.01.05 12:50:

при написании использовались мудрые советы данные умными людьми на этом же форуме:

http://phpclub.ru/talk/showthread.php?s=&threadid=58425
 

Фанат

oncle terrible
Команда форума
по-твоему, гугль пишет в виндозе?
а всякие кэши и old_q ты не учитываешь?
 

imdem

Guest
гуглы которые ходили по мне )) имели исключительно виндузовую кодировку.

как только наткнусь на другую - мона и ее описать и добавить..
пока просто нет примера


кэши и предыдущие запросы мне пока не нужны...впрочем добавить их сюда не так уж и сложно) - механизм не должен сильно поменяться)
 

Фанат

oncle terrible
Команда форума
что значит - пока не нужны?
человек искал фразу "ключевое слово один ключевое слово два ключевое слово три" потом написал "лопата" и поставил галочку искать в результатах поиска.

Непонятно только, с какой стати я должен тебя уговаривать.

И с какой стати ты решил, что твоя поделка заинтересует кого-то из продвинутых?
 

SiMM

Новичок
Re: Разбор поисковой строки(решение)

Автор оригинала: imdem
PHP:
$sign = array("poisk" => array('aport.ru','km.ru','msn.com','google','tut.by','yahoo.com','alltheweb.com','ualist.com','metabot.ru','mail.ru','yandsearch','rambler.ru','yandpage','yandbtm'),"nm_var" => array('r','sq','q','q','query','p','q','qry_str','st','q','text','words','text','text'), nm_kod =>array('w','w','w','w','w','w','w','w','w','w','w','w','k','w'));
По-моему, неочевидная и неудобная структура
PHP:
$sign = array('aport.ru' => array('var'=>'r'   ,'kod'=>'w'), 
              'km.ru'    => array('var'=>'sq'  ,'kod'=>'w'), 
              ...
              'yandbtm'  => array('var'=>'text','kod'=>'w'), 
             );
По поводу кодировки - вопрос в действительности спорный.
PS: и запомни одну вещь - в PHP строки НЕОБХОДИМО заключать в кавычки (это я про nm_kod => array('w', ... )
 

imdem

Guest
)ок - здравая мысля - про old_q
спасиб

ps про заинтересует - у меня нет такой задачи...что я - клоун что ли...заинтересовывать)

-~{}~ 12.01.05 13:18:

to simm

твоя структура массива безусловно лучше, впрочем...в оригинале у меня все это в базе валяется)...а массив только для самодостаточности) функции


по поводу кодировки - пока вижу только экспериментальный вариант - вручную искать сигнатуры и описывать и кодировку и переменную.

можете предложить вариант автоматического распознавания?
ps видел в хелпах функции mb_xxxxxx - ими? - у меня пока пшп их не поддерживает(
 

kagemusha

Guest
Скажите пожалуйста где тут учитывается то, что гугль, как и любая система использующая UTF русский текст кодирует двумя байтами, т.е. одна буква в поисковой строке - это %xx%xx такая комбинация в адресной.
Пытаюс вашу функцию прикрутить к своему серверу (спасибо, кстати) - на Яндексе действительно все хорошо работает, а вот с гуглом траблы. Может я чего не понимаю?
 

imdem

Guest
думаю что стоит еще прикрутить перевод из юникода - ну пополнив соответствующей аббревиатурой))) словарик
да там еще пара мелких глюков-ошибок устраненных в процессе эксплуатации)

последний вариант - добавлено немножко преобразований))) - приведений к одному виду

ну а юникод я не реализовал только потому что версия пшп у меня не поддерживает юникод-преобразование...да и в поддерживаемых сайтах таких строк пока ничтожно мало - одно-два на несколько тысяч

так что пока отложил на потом)

function parseadr($stradr)
{
$stradr=str_replace("=text%3D","=&text%3D",$stradr);
$stradr=str_replace("?text","?&text",$stradr);


$sign = array('poisk' => array('aport.ru','km.ru','msn.com','google','tut.by','yahoo.com','alltheweb.com','ualist.com','metabot.ru','mail.ru','yandsearch','rambler.ru','yandpage','yandbtm'),'nm_var' => array('r','sq','q','q','query','p','q','qry_str','st','q','text','words','text','text'), 'nm_kod' =>array('w','w','w','w','w','w','w','w','w','w','w','w','k','w'));

$kod='w';



for ($i=0;$i<14;$i++)
{
if (strpos($stradr,$sign["poisk"][$i])>0)
{
$kod=$sign["nm_kod"][$i];
$nm_var=$sign["nm_var"][$i];
}
}

$stradr=preg_replace('/%(?:25)?([0-9a-f]{2})/sei','chr(hexdec("$1"))',$stradr);
parse_str($stradr, &$arr);
$stradr=$arr[$nm_var];
$stradr=convert_cyr_string ($stradr,$kod,"w");

return $stradr;
}

вызываю как
$host_from=$_SERVER['HTTP_REFERER'];
$s_words=parseadr($host_from);
 

kagemusha

Guest
Originally posted by imdem


ну а юникод я не реализовал только потому что версия пшп у меня не поддерживает юникод-преобразование...да и в поддерживаемых сайтах таких строк пока ничтожно мало - одно-два на несколько тысяч

Короче таже фигня, у меня тоже эти модули не поставлены
 

SiMM

Новичок
> И нафига сдался УТФ8?
Потому что он используется в частности Google'м

> Чтобы один раз из миллиона искать в кодировке племени Мумбо-Юмбо?
Это-то здесь при чём? Перечитайте топик с самого начала до полного просветления.
 

stellar

Guest
Автор оригинала: SiMM
> И нафига сдался УТФ8?
Потому что он используется в частности Google'м
Гугл, в частности, умеет понимать не только UTF8.
И при этом отлично работает.
 

SiMM

Новичок
> Гугл, в частности, умеет понимать не только UTF8.
Может со второго раза дойдёт Перечитайте топик с самого начала до полного просветления. Если это не поможет - медитируйте над HTTP_REFERER.
Я вообще непонимаю, какого лешего вы влезли в этот топик? Умность свою продемонстрировать?
 

kagemusha

Guest
Originally posted by stellar
Гугл, в частности, умеет понимать не только UTF8.
И при этом отлично работает.
Ну вобщем смысл в том, что не я выбираю как пользоваться гуглом, а некий удаленный пользователь, кодировки которого зависят от многих параметров, в частности от о/с пользователя , браузера и т.п. (это на сколько я понимаю) Мне с гугла ссылки чеще всего приходят именно в юникоде.
Вообще интересно конечно от чего это зависит. Но пока это непонятно.
 
Сверху