Разработка плагинов, модулей и скриптов > Полезный PHP код > Поисковая фраза на основе HTTP_REFERER

Поисковая фраза на основе 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;
}