$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`ом
но лучше пользоваться вариантом подсказанным Nikitian`ом

Спустя 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 написал(а):
Спасибо. Почти...
Вот код
Но.. всеравно немного не то.
В матрице поисковых машин не все элементы являются матрицами. Поэтому запись if(in_array ("$k",$a)) не сработает.
Подскажите пожалуйста правильный вариант.
Вот код
$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 написал(а):
Если я вас правильно понял, то проблема в том что в матрице есть не все возможные параметры. Значит внесите туда все

Спустя 27 минут, 44 секунды (17.07.2010 - 18:48) brdm написал(а):
Нет. В матрице все есть. Только одни параметры представлены в виде одной строки (типа 'text') a другие в виде матрицы (типа array('q','query'))
Представленный код ищет распарсенный ключ в матрицах (типа array('q','query')) Но если хост в матрице поисковых машин представлен строкой (типа 'q') то... Прошу просмотреть код и подправить так, чтобы находить запрос в любых случаях.
Представленный код ищет распарсенный ключ в матрицах (типа 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 это строка, а в каком массив строк.
Как это определить? Не приходит в голову..
Наверное нужно как то определить в каком случае $a это строка, а в каком массив строк.
Как это определить? Не приходит в голову..
Спустя 10 минут, 11 секунд (17.07.2010 - 21:26) Kuzya написал(а):
is_array() 
Почитайте как-нибудь документацию

Почитайте как-нибудь документацию
Спустя 3 минуты, 55 секунд (17.07.2010 - 21:30) Basili4 написал(а):
меня пугает вот эта конструкця
foreach ($arr as $k=>$v)
{
if(in_array ("$k",$a))
$word = $v;break;
}
зачем цикл ??????????????7 если пр первом же проходе будет break;?????
foreach ($arr as $k=>$v)
{
if(in_array ("$k",$a))
$word = $v;break;
}
зачем цикл ??????????????7 если пр первом же проходе будет break;?????
Спустя 40 минут, 18 секунд (17.07.2010 - 22:10) brdm написал(а):
Да, спасибо. С документацией у меня действительно клинит. break тоже подправил.
Вроде так:
Если, что не так, подправте please
Вроде так:
$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;
бряк тут тоже не пойму зачем тут цикл внешний тогда он все ровно только он проход делает.
}
elseif("$k" == $value) {$word = $v; break;}
}
break;
бряк тут тоже не пойму зачем тут цикл внешний тогда он все ровно только он проход делает.
Спустя 1 час, 17 минут, 14 секунд (17.07.2010 - 23:31) Kuzya написал(а):
Вроде всё супер

Спустя 6 часов, 27 минут, 54 секунды (18.07.2010 - 05:59) Basili4 написал(а):
вчера было поздно я скобку пропустил да все ок.
Спустя 4 часа, 8 минут, 8 секунд (18.07.2010 - 10:07) brdm написал(а):
Спасибо за поддержку.
Проверил в реальных условиях. Работает нормально.
Еще по поводу ошибок в матрице поисковых машин...
Подскажите если где заметили.
Проверил в реальных условиях. Работает нормально.
Еще по поводу ошибок в матрице поисковых машин...
Подскажите если где заметили.