Поисковая фраза на основе HTTP_REFERER
Функция возвращает поисковую фразу на основе анализа заголовка HTTP_REFERER. Требует наличия библиотеки iconv, так как некоторые русские поисковики кодируют запросы в разных кодировках.
Примеры использования:
echo search_query( $_SERVER['HTTP_REFERER '] );
echo search_query( 'http://images.yandex.ru/yandsearch?text=%D1%80%D0%B5%D0%BC%D0%BE%D0%BD%D1%82+%D0%B2%D1%81%D1%8F%D0%BA%D0%BE%D0%B3%D0%BE+%D0%B1%D0%B0%D1%80%D0%B0%D1%85%D0%BB%D0%B0&stype=image&wp=any&icolor=&type=&itype=&serverurl=wellservice.ru' );
Поддерживаемые поисковики:
yandex (также переход с images.yandex - поиск изображений)
google (также переход с images.google - поиск изображений)
rambler
mail.ru
yahoo
qip
msn
bing
/*
Возвращает поисковую фразу на основе анализа заголовка HTTP_REFERER
Автор: http://trickywebs.org.ua/
*/
function search_query( $queryUrl='' ) {
$queryUrl = trim( $queryUrl );
if( empty( $queryUrl ) ) return false;
$parseUrl = parse_url( $queryUrl );
# Detect search engine
switch( $parseUrl['host'] ) {
case 'yandex.ru':
case 'images.yandex.ru':
case 'yandex.ua':
case 'images.yandex.ua':
case 'yandex.by':
case 'images.yandex.by':
case 'yandex.com':
case 'images.yandex.com':
$word = 'text';
$engine = 'yandex';
break;
case 'rambler.ru':
case 'nova.rambler.ru':
$word = 'query';
$engine = 'rambler';
break;
case 'search.qip.ru':
$word = 'query';
$engine = 'qip';
break;
case 'yahoo.com':
case 'search.yahoo.com':
$word = 'p';
$engine = 'yahoo';
break;
case 'search.icq.com':
$word = 'q';
$engine = 'icq';
break;
case 'google.ru':
case 'google.com':
case 'google.com.ua':
case 'google.com.by':
case 'www.google.ru':
case 'www.google.com':
case 'www.google.com.ua':
case 'www.google.com.by':
$word = 'q';
$engine = 'google';
break;
case 'mail.ru':
case 'go.mail.ru':
$word = 'q';
$engine = 'mail';
break;
case 'msn.com':
case 'bing.com':
$word = 'q';
$engine = 'msn';
break;
default:
$word = 'q';
$engine = 'unknown';
break;
}
$query = isset( $parseUrl['query'] ) ? $parseUrl['query'] : '';
parse_str( $query, $output );
$result = isset( $output[$word] ) ? trim( stripslashes( $output[$word] ) ) : '';
switch( $engine ) {
# mail.ru encodes it's queries in Windows-1251
case 'mail':
$result = iconv( 'windows-1251', 'utf-8', $result );
break;
case 'rambler':
# Double-decoded strings are sometimes sent by Rambler
if( strpos( $queryUrl, '&old_q=&' ) ) {
$result = iconv( 'utf-8', 'windows-1251', $result );
$result = iconv( 'KOI8-R', 'utf-8', $result );
}
break;
# Decode strange queries from Google images search
case 'google':
if( isset( $output['prev'] ) && ( $result = $output['prev'] ) && ( 0 === strpos( $result, '/images?' ) ) ) {
$imagesQuery = strstr( $result, 'q=' );
parse_str( $imagesQuery, $queryVars );
$result = isset( $queryVars[$word] ) ? trim( stripslashes( $queryVars[$word] ) ) : '';
}
break;
}
return empty( $result ) ? false : $result;
}