Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6454
Последний выпуск: 19.06.2015

URLEncode декодирует здесь на сайте ОК, а вот в PHP - не 100%

83K
06 ноября 2012 года
hidogili
13 / / 06.11.2012
URLEncode декодирует здесь на сайте ОК, а вот в PHP - не 100%

Например:
Закодированный текст в кодировке UTF-8:
%F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB

URLEncode и URLDecode online дает:
у цыганок волосы

В php 95% раскодируется ок, а вот эта и другие немногие - дают ромбики.
Юзаю Друпал 6, php самый свежий

Куда копать?
4
06 ноября 2012 года
mike
3.7K / / 01.10.2002
Цитата: hidogili
Да, ошибся, строка %F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB в windows-1251, а не в utf
а urldecode() думает, что ее аргумент в utf
Но go.mail.ru (и некот.другие) кодируют урлы в windows-1251

Тогда если есть %D1 - вызывать urldecode()
А иначе - как раскодировать? мне неясно пока



Сначала urldecode(), потом iconv.

По строке нельзя однозначно определить кодировку. Нужно понимать что %D1 - Ñ, %D0 - Ð в windows-1251.

Чтобы раскодировать поисковые запросы нужно иметь базу данных, какая поисковая система в какой кодировке при какой адресной строке работает. Не даром CNStats каждый месяц обновляет словари данных.

83K
14 ноября 2012 года
hidogili
13 / / 06.11.2012
Окончательный отлаженный вариант с исправлением ошибок набора при ошибочном состоянии переключения клавиатуры:
ттут
4
06 ноября 2012 года
mike
3.7K / / 01.10.2002
Копать в сторону посмотреть коды символов после раскодировки с помощью ord(). Думаю что проблема с кодировкой искомой строки.


%F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB - это windows-1251.

Русский UTF можно на глаз определить по %D1 и %D1 в каждом нечетном байте (все русские буквы в UTF-8 двухбайтовые)
83K
06 ноября 2012 года
hidogili
13 / / 06.11.2012
Да, ошибся, строка %F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB в windows-1251, а не в utf
а urldecode() думает, что ее аргумент в utf
Но go.mail.ru (и некот.другие) кодируют урлы в windows-1251

Тогда если есть %D1 - вызывать urldecode()
А иначе - как раскодировать? мне неясно пока
83K
06 ноября 2012 года
hidogili
13 / / 06.11.2012
Благодарю, вот накидал свою функцию, покрывающую вроде всё, что дают основные поисковики.
У меня работает четко, Если что не так - укажите...

Код:
/**
 * My helper D6 function: Get search string from Search Engine GET request
 */

function _statistics_ss($referer) {
  $ss = ''; $ru_exists = false; $nested_url = false;
  if ($referer) {
    if (strpos($referer, '%') === false) $ss = substr(strstr($referer, '='),1);
    elseif (($i = stripos($referer, '=http://')) !== false) {
      $nested_url = true;
      $ss = substr($referer, $i+1);
    }
    else {
      $ru_exists = true;
      $ss = urldecode(strstr($referer, '%'));
      if ($i = stripos($ss, '&q=') !== false) $ss = substr($ss, $i+5);
      if (stripos($referer, '%D1') === false && stripos($referer, '%D0') === false)
        $ss = iconv("windows-1251", "UTF-8", $ss);
        //or equal: $ss = mb_convert_encoding($ss, "UTF-8", "windows-1251");
      if (strpos($ss, '%') !== false) // for nested urldecode
        $ss = urldecode(strstr($ss, '%')); //by example google.by/imgres?imgurl=...
    }

    if ((stripos($referer, 'rambler.') !== false) && ($i = strpos($ss, '=')) !== false)
      $ss = substr($ss, $i+1); //nova.rambler.ru/search?btnG=Найти!&query=книги...
   
    if (strpos($ss, '&') !== false) // for ya & google
      $ss = substr($ss, 0, strpos($ss, '&')); // remove trail params

    if ($nested_url) $ss = urldecode($ss);
     
    if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
    elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
    else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
  }
  return $ss;
}
83K
07 ноября 2012 года
hidogili
13 / / 06.11.2012
Код:
/**
 * My helper D6 function: Get search string from Search Engine GET request
 */

function _statistics_ss($referer) {
  $ss = '';
  if ($referer) {
    $ru_exists = (strpos($referer, '%') !== false);
    if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
    else {
      $ss = $referer;
     
      if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
        && ($i = strpos($ss, '&text=')) !== false)
          $ss = substr($ss, $i+5); // +5, NOT +6 !!!

      $ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!

      if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
      elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
      elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
      elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);

      $ss = urldecode($ss);

      // if obsolete windows-1251 then convert to UTF-8
      if ((stripos($referer, '%D1') === false
        && stripos($referer, '%D0') === false)
        )
          $ss = iconv("windows-1251", "UTF-8", $ss);
    }

    if ((stripos($referer, 'rambler.') !== false)
      && ($i = strpos($ss, 'query')) !== false)
      $ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
   
    if (strpos($ss, '&') !== false) // for ya & google
      $ss = substr($ss, 0, strpos($ss, '&')); // remove trail params

        // Customize output: Bold for russion strings and red (maroon) for Yandex
    if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
    elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
    else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
  }
  return $ss;
}
83K
07 ноября 2012 года
hidogili
13 / / 06.11.2012
Погонял еще "русский urldecode" по сотням урлов и допилил функцию
вырезания поисковой строки из запросов с поисковиков
(где-то 98% русских запросов, так что для английских не отлаживал):
Код:
/**
 * My helper D6 function: Get search string from Search Engine GET request
 */

function _statistics_ss($referer) {
  $ss = '';
  if ($referer) {
    $ru_exists = (strpos($referer, '%') !== false);
    if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
    else {
      $ss = $referer;
     
      if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
        && ($i = strpos($ss, '&text=')) !== false)
          $ss = substr($ss, $i+5); // +5, NOT +6 !!!

      $ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!

      if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
      elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
      elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
      elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);

      $ss = urldecode($ss);

      // if obsolete windows-1251 then convert to UTF-8
      if ((stripos($referer, '%D1') === false
        && stripos($referer, '%D0') === false)
        )
          $ss = iconv("windows-1251", "UTF-8", $ss);
    }

    if ((stripos($referer, 'rambler.') !== false)
      && ($i = strpos($ss, 'query')) !== false)
      $ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
   
    if (strpos($ss, '&') !== false) // for ya & google
      $ss = substr($ss, 0, strpos($ss, '&')); // remove trail params

        // Customize output: Bold for russion strings and red (maroon) for Yandex
    if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
    elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
    else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
  }
  return $ss;
}
83K
07 ноября 2012 года
hidogili
13 / / 06.11.2012
Почему-то 2 раза отпечаталось - можно удалить первый дубль.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог