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
Собственно только вчера руки дошли до реализации задуманного - с подсказками , которые дали на этом же форуме.
В итоге получилась самодостаточная 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