[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как выудить поисковый запрос
brdm
Допустим вот поисковый запрос

$refer = "http://yandex.ru/yandsearch?text=+proxy+%d0%b2%d0%b8%d0%b4%d0%b5%d0%be%d1%83%d1%80%d0%be%d0%ba&clid=14585&lr=35";


существует файл матрицы поисковых машин

   $searchEngines=array(
'images.google.'=>array('q','prev'),
'bing.com'=>'q',
'.alot.'=>'q',
'a993.com'=>'q1',
'abcsok.'=>'q',
'alltheweb.'=>'q',
'altavista.'=>'q',
'aol.'=>array('q','query','encquery'),
'aolsvc.'=>'query',
'avantfind.com'=>'keywords',
'bonvote.com'=>'search',
'bonweb.com'=>'search',
'comcast.net'=>'q',
'conduit.'=>'q',
'eniro.se'=>'search_word',
'excite.'=>'search',
'google.'=>array('q','as_q'),
'gogo.ru'=>'q',
'yandex.'=>array('text','query'),
'ya.ru'=>'text',
'hotbot.'=>'query',
'icerocket.com'=>'q',
'icq.com'=>'q',
'isheyka.com'=>'q',
'midco.net'=>'q',
'live.com'=>'q',
'msn.'=>'q',
'yahoo.'=>array('p','k'),
'search.'=>'q',
'kvasir.no'=>'q',
'myway.com'=>'searchfor',
'netscape.'=>array('q','query'),
'oceanfree.net'=>'as_q',
'qip.ru'=>'query',
'sweetim.com'=>'q',
'tut.by'=>'query',
'ukr.net'=>'search_query',
'search.oboz.ua'=>'k',
'search.www.infoseek.co.jp'=>'qt',
'.setooz.com'=>'query',
'toile.com'=>'q',
'vinden.nl'=>'q',
'.i.ua'=>'q',
'.mail.ru'=>array('q','tag'),
'.onru.ru'=>'q',
'aport.ru'=>'r',
'find.ru'=>'text',
'gde.ru'=>array('keywords','query','t','search_query','id'),
'go.km.ru'=>'sq',
'meta.ua'=>'q',
'metabot.ru'=>'st',
'nerus.ru'=>'query',
'nigma.ru'=>array('s','pq'),
'nova.rambler.ru'=>'query',
'poisk.ru'=>'text',
'protonet.ru'=>'q',
'rambler.ru'=>'words',
'tyndex.ru'=>'pnam',
'webalta.ru'=>'q',
'exactseek.com'=>array('q','query'),
'lycos.' => 'query',
'ask.' => 'q',
'cnn.' => 'query',
'looksmart.' => 'qt',
'about.' => 'terms',
'mamma.' => 'query',
'gigablast.' => 'q',
'voila.' => 'rdata',
'virgilio.' => 'qs',
'baidu.' => 'wd',
'alice.' => 'qs',
'najdi.' => 'q',
'club-internet.' => 'q',
'mama.' => 'query',
'seznam.' => 'q',
'netsprint.' => 'q',
'szukacz.' => 'q',
'yam.' => 'k',
'pchome.' => 'q',
);


вот небольшой код распарсивания запроса

$tmp = parse_url(urldecode(trim($refer)));
// имя хоста без www
$site = $tmp['host'];
// без www
$wsite = str_replace("www.","",$tmp['host']);
// строка запроса после ? и определение ее параметров (переменных)
$str = $tmp['query'];
parse_str($str);


Предложите пожалуйста как на базе приведенной матрицы поисковых машин
выделить из строки запроса сам текст запроса в нужной кодировке (например win-1251).

Спасибо.



Спустя 1 день, 5 часов, 6 минут, 57 секунд (15.07.2010 - 16:14) Kuzya написал(а):
Берём Referer (адрес с поисковика), перегоняем через parse_url(). В полученном массиве ищем ячейку query, разбиваем её explode`ом по символу "&" - получаем массив всех параметров в виде
Цитата

param=value
param1=value1
param2=value2

Дальше обходим каждую эту запись, и опять бьём explode`ом по знаку равенства. Таким образом, в конце этого действия мы получаем несколько массивов виде параметр => значение. Склеиваем их в один большой.
По хосту (его даст parse_url в начале) определяем параметр из матрицы (кстати в ней есть ошибки) ну и получаем его значение - оно лежит в соответствующей ячейке основного массива параметров.
Затем перекодируем его через url_decode. И наконец с помощью iconv обращаем в необходимую кодировку.

Спустя 49 минут, 46 секунд (15.07.2010 - 17:03) Nikitian написал(а):
Цитата (Kuzya @ 15.07.2010 - 13:14)
Дальше обходим каждую эту запись, и опять бьём explode`ом по знаку равенства.

Или опять же воспользуемся специализированной функцией parse_str()

Спустя 23 часа, 38 минут, 16 секунд (16.07.2010 - 16:42) brdm написал(а):
Значит получается так:


$tmp = parse_url(urldecode(trim($refer)));
$site = $tmp['host'];
$str = $tmp['query'];
$a = explode("&",$str);
for($i = 0; $i < count($a); $i++)
$b = explode("=",$a[$i]);


Можно дальше в виде кода? Склейка не получается.

Спустя 1 час, 15 минут, 53 секунды (16.07.2010 - 17:58) Kuzya написал(а):
array_merge().
но лучше пользоваться вариантом подсказанным Nikitian`ом smile.gif

Спустя 7 часов, 50 минут, 53 секунды (17.07.2010 - 01:49) brdm написал(а):
Спасибо. Стало немного яснее.

Цитата
По хосту (его даст parse_url в начале) определяем параметр из матрицы


Ведь хост может быть типа 'www.yandex.kz', а параметр в матрице только 'yandex.'
Тоесть если запрос пришел из www.yandex.kz то как найти, что он соответствует элементу матрицы поисковых машин с ключом 'yandex.'?
А ключ там есть еще и такой '.alot.' и еще всякие разные совсем не похожие на реальные хосты. Как найти соответствие? Ведь ключи все устроены по разному (точка спереди, точка сзади и тому под. )
Можно в виде кода?

Спустя 5 часов, 14 минут, 37 секунд (17.07.2010 - 07:03) Kuzya написал(а):
Обходим массив матриц и выполняем substr_count(хост, ячейка_матрицы).
Если где нашли совпадение - значит это то что вам нужно.

Спустя 10 часов, 29 минут, 12 секунд (17.07.2010 - 17:32) brdm написал(а):
Спасибо. Почти...
Вот код

$tmp = parse_url(urldecode(trim($refer)));
$site = $tmp['host'];
$str = $tmp['query'];
parse_str($str,$arr);
foreach ($searchEngines as $key=>$value)
{
if(substr_count($site, $key))
{
$a = $value;
foreach ($arr as $k=>$v)
{
if(in_array ("$k",$a))
$word = $v;break;
}
break;
}
}


Но.. всеравно немного не то.
В матрице поисковых машин не все элементы являются матрицами. Поэтому запись if(in_array ("$k",$a)) не сработает.

Подскажите пожалуйста правильный вариант.


Спустя 47 минут, 33 секунды (17.07.2010 - 18:20) Kuzya написал(а):
Если я вас правильно понял, то проблема в том что в матрице есть не все возможные параметры. Значит внесите туда все smile.gif

Спустя 27 минут, 44 секунды (17.07.2010 - 18:48) brdm написал(а):
Нет. В матрице все есть. Только одни параметры представлены в виде одной строки (типа 'text') a другие в виде матрицы (типа array('q','query'))

Представленный код ищет распарсенный ключ в матрицах (типа array('q','query')) Но если хост в матрице поисковых машин представлен строкой (типа 'q') то... Прошу просмотреть код и подправить так, чтобы находить запрос в любых случаях.

Спустя 18 минут, 34 секунды (17.07.2010 - 19:06) Kuzya написал(а):
Вам нужно проверять не через in_array(), а немного по другому. Обходим массив $a через foreach, и если текущее его значение является строкой - сравниваем с $k чреез ==. Если массивом - перебираем его ещё одним foreach`ем и сравниваем, опять же, через ==

Спустя 2 часа, 9 минут, 41 секунда (17.07.2010 - 21:16) brdm написал(а):
Так в том то и дело, что $а в одном случае может быть массивом строк array('q','query') а в другом случае строкой 'q' foreach подойдет только если $a является массивом строк.
Наверное нужно как то определить в каком случае $a это строка, а в каком массив строк.

Как это определить? Не приходит в голову..

Спустя 10 минут, 11 секунд (17.07.2010 - 21:26) Kuzya написал(а):
is_array() smile.gif
Почитайте как-нибудь документацию

Спустя 3 минуты, 55 секунд (17.07.2010 - 21:30) Basili4 написал(а):
меня пугает вот эта конструкця

foreach ($arr as $k=>$v)
{
if(in_array ("$k",$a))
$word = $v;break;
}

зачем цикл ??????????????7 если пр первом же проходе будет break;?????

Спустя 40 минут, 18 секунд (17.07.2010 - 22:10) brdm написал(а):
Да, спасибо. С документацией у меня действительно клинит. break тоже подправил.
Вроде так:

$tmp = parse_url(urldecode(trim($refer)));
$site = $tmp['host'];
$str = $tmp['query'];
parse_str($str,$arr);
foreach ($searchEngines as $key=>$value)
{
if(substr_count($site, $key))
{
foreach ($arr as $k=>$v)
{
if(is_array($value))
{
if(in_array ("$k",$value))
{$word = $v; break;}
}

elseif("$k" == $value) {$word = $v; break;}
}

break;
}
}


Если, что не так, подправте please

Спустя 3 минуты, 56 секунд (17.07.2010 - 22:14) Basili4 написал(а):
"$k" можно и без ковычек

}
elseif("$k" == $value) {$word = $v; break;}
}
break;

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

Спустя 1 час, 17 минут, 14 секунд (17.07.2010 - 23:31) Kuzya написал(а):
Вроде всё супер smile.gif

Спустя 6 часов, 27 минут, 54 секунды (18.07.2010 - 05:59) Basili4 написал(а):
вчера было поздно я скобку пропустил да все ок.

Спустя 4 часа, 8 минут, 8 секунд (18.07.2010 - 10:07) brdm написал(а):
Спасибо за поддержку.
Проверил в реальных условиях. Работает нормально.

Еще по поводу ошибок в матрице поисковых машин...
Подскажите если где заметили.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.