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

Ваш аккаунт

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

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

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

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

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

Исправлять тексты, набранные при ошибочном состоянии переключения клавиатуры

83K
08 ноября 2012 года
hidogili
13 / / 06.11.2012
В дополнение к PHP код вырезания поисковой строки из запросов с поисковиков хотелось бы и исправлять тексты, набранные при ошибочном состоянии переключения клавиатуры.

Поисковики то исправляют, но в GET остаются кракозябры.
Например: dct j cyf[ вместо "Все о снах"

М.б. есть готовые решения хотя бы только для русско-английской раскладки клавиатуры?
4
08 ноября 2012 года
mike
3.7K / / 01.10.2002
 
Код:
$str=strtr($str,array(
    'q'=>'й',
    'w'=>'ц',
    ...
    '.'=>'ю',
    ));
83K
14 ноября 2012 года
hidogili
13 / / 06.11.2012
Наконец закончил отладку "русского urldecode". Даёт практичесуи 100% выход чистых поисковых строк.
2 функции. 1-ая преобразует кракозябры ошибок переключения анело-русской клавиатуры и еще (что не редко) заподноевропейские кракозябры.
Таблицу сооставил по фактическим запросом и пока нет исходных символов для рус.букв "Э" и "Ъ". Кто знает - пришлите сюда.
Вот она:
Код:
/**
 * My helper function: Test & Recover keyboard switch mistakes
 */

function _statistics_test_keyboard_switch_mistake($ss, $ss_test) {
  if (!$ss || is_numeric($ss)) return ''; //$ss;
  if (stripos($ss, 'http://') !== false) return $ss;
  if (stripos($ss, 'https://') !== false) return $ss;
  if (stripos($ss, 'site:') !== false) return $ss;
 
  if ($ss_test && (stripos($ss_test, '%C3') !== false)) { // yandex даёт такое!
    // фото с надписью кто духом силен тот победит // ôîòî ñ íàäïèñüþ êòî äóõîì ñèëåí òîò ïîáåäèò
    $s2 = strtr($ss, array(
      'à'=>'а', 'á'=>'б', 'â'=>'в', 'ã'=>'г', 'ä'=>'д', 'å'=>'е', '¸'=>'ё',
      'æ'=>'ж', 'ç'=>'з', 'è'=>'и', 'é'=>'й', 'ê'=>'к', 'ë'=>'л', 'ì'=>'м',
      'í'=>'н', 'î'=>'о', 'ï'=>'п', 'ð'=>'р', 'ñ'=>'с', 'ò'=>'т', 'ó'=>'у',
      'ô'=>'ф', 'õ'=>'х', 'ö'=>'ц', '÷'=>'ч', 'ø'=>'ш', 'ù'=>'щ', '_'=>'ъ',
      'û'=>'ы', 'ü'=>'ь', '_'=>'э', 'þ'=>'ю', 'ÿ'=>'я',
      'À'=>'А', 'Á'=>'Б', 'Â'=>'В', 'Ã'=>'Г', 'Ä'=>'Д', 'Å'=>'Е', '.'=>'Ё',
      'Æ'=>'Ж', 'Ç'=>'З', 'È'=>'И', 'É'=>'Й', 'Ê'=>'К', 'Ë'=>'Л', 'Ì'=>'М',
      'Í'=>'Н', 'Î'=>'О', 'Ï'=>'П', 'Ð'=>'Р', 'Ñ'=>'С', 'Ò'=>'Т', 'Ó'=>'У',
      'Ô'=>'Ф', 'Õ'=>'Х', 'Ö'=>'Ц', '_'=>'Ч', 'Ø'=>'Ш', 'Ù'=>'Щ', '_'=>'Ъ',
      'Û'=>'Ы', 'Ü'=>'Ь', '_'=>'Э', 'Þ'=>'Ю', 'Ÿ'=>'Я'  ));
    $ss = $s2 .' // '. $ss; // Save source string for visual check!
    return $ss;
  }

  if (preg_match('/^[а-яА-ЯёЁ]+$/', $ss)) // if exists russian letter
    return $ss;

  if (!preg_match('/^[^a-zA-Z]+$/', str_ireplace('.ru', '', $ss))) { // if exists english letter (exclude '.ru')
    $s2 = strtr($ss, array(
      'f'=>'а', ','=>'б', 'd'=>'в', 'u'=>'г', 'l'=>'д', 't'=>'е', '`'=>'ё',
      ';'=>'ж', 'p'=>'з', 'b'=>'и', 'q'=>'й', 'r'=>'к', 'k'=>'л', 'v'=>'м',
      'y'=>'н', 'j'=>'о', 'g'=>'п', 'h'=>'р', 'c'=>'с', 'n'=>'т', 'e'=>'у',
      'a'=>'ф', '['=>'х', 'w'=>'ц', 'x'=>'ч', 'i'=>'ш', 'o'=>'щ', ']'=>'ъ',
      's'=>'ы', 'm'=>'ь', "'"=>'э', '.'=>'ю', 'z'=>'я',
      'F'=>'А', '<'=>'Б', 'D'=>'В', 'U'=>'Г', 'D'=>'Д', 'T'=>'Е', '~'=>'Ё',
      ':'=>'Ж', 'P'=>'З', 'B'=>'И', 'Q'=>'Й', 'R'=>'К', 'K'=>'Л', 'V'=>'М',
      'Y'=>'Н', 'J'=>'О', 'G'=>'П', 'H'=>'Р', 'C'=>'С', 'N'=>'Т', 'E'=>'У',
      'A'=>'Ф', '{'=>'Х', 'W'=>'Ц', 'X'=>'Ч', 'I'=>'Ш', 'O'=>'Щ', '}'=>'Ъ',
      'S'=>'Ы', 'M'=>'Ь', '"'=>'Э', '>'=>'Ю', 'Z'=>'Я'  ));
    if (strrpos($ss,'<') !== false) $ss = $s2; // < = Б  и  . = Ю
    else $ss .= ' // '. $s2; // Save source string for visual check!
    return $ss;
  }

  return $ss;
    /* $s2 = strtr($ss, array(
      '_'=>'а', '_'=>'б', '_'=>'в', '_'=>'г', '_'=>'д', '_'=>'е', '_'=>'ё',
      '_'=>'ж', '_'=>'з', '_'=>'и', '_'=>'й', '_'=>'к', '_'=>'л', '_'=>'м',
      '_'=>'н', '_'=>'о', '_'=>'п', '_'=>'р', '_'=>'с', '_'=>'т', '_'=>'у',
      '_'=>'ф', '_'=>'х', '_'=>'ц', '_'=>'ч', '_'=>'ш', '_'=>'щ', '_'=>'ъ',
      '_'=>'ы', '_'=>'ь', '_'=>'э', '_'=>'ю', '_'=>'я',
      '_'=>'А', '_'=>'Б', '_'=>'В', '_'=>'Г', '_'=>'Д', '_'=>'Е', '_'=>'Ё',
      '_'=>'Ж', '_'=>'З', '_'=>'И', '_'=>'Й', '_'=>'К', '_'=>'Л', '_'=>'М',
      '_'=>'Н', '_'=>'О', '_'=>'П', '_'=>'Р', '_'=>'С', '_'=>'Т', '_'=>'У',
      '_'=>'Ф', '_'=>'Х', '_'=>'Ц', '_'=>'Ч', '_'=>'Ш', '_'=>'Щ', '_'=>'Ъ',
      '_'=>'Ы', '_'=>'Ь', '_'=>'Э', '_'=>'Ю', '_'=>'Я'  ));*/

}
2-ая функция - это доведенный вариант из http://forum.codenet.ru/q72152/URLEncode+декодирует+здесь+на+сайте+ОК%2C+а+вот+в+PHP+-+не+100%25

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

function _statistics_ss($referer) {
  if (!$referer) return '';
  $ss = $referer;
 
  //remove %26 (&), 2F(/), %3D (=), %3F (?) and other special symbols
  $ss_temp = str_replace('%2', '', str_replace('%3', '', $ss));
  $ru_exists = (strpos($ss_temp, '%') !== false);

  // for google images
  if (stripos($referer,'google.') !== false && stripos($referer,'/imgres?') !== false)
    if ($ru_exists) $ss = substr($ss, stripos($ss, '%'));
    elseif (($i = strpos($ss, 'imgurl=')) !== false)
      $ss = substr($ss, $i+7);

  // for: images.yandex
  if (stripos($referer, 'yandex.') !== false && stripos($referer,'images.yandex') !== false)
    if ($ru_exists) $ss = substr($ss, stripos($ss, '%'));
    elseif (($i = strpos($ss, '&text=')) !== false)
      $ss = substr($ss, $i+6);

  if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2); // google,mail,vk
  elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5); // ya
  elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6); //rambler,qip
  elseif (($i = stripos($ss, 'words=')) !== false) $ss = substr($ss, $i+6); //rambler
  elseif (($i = stripos($ss, 'search=')) !== false) $ss = substr($ss, $i+7); //wikipedia, netex.mako.co.il
  elseif (($i = stripos($ss, '?s=')) !== false) $ss = substr($ss, $i+3); // nigma
  elseif (($i = stripos($ss, '&s=')) !== false) $ss = substr($ss, $i+3); // nigma
  elseif (($i = stripos($ss, 'back=')) !== false) $ss = substr($ss, $i+5); //yahoo

  if (!$ru_exists) {
    $ss_test = '';
    if (stripos($ss, '%') !== false) $ss = trim(urldecode($ss));
  }
  else {
    $ss = str_ireplace('%E2%98%A0', '', $ss); //for: go.mail.ru !!

    if (($i=strpos($ss, '&')) !== false) // google: 2 кодировки разом
      $ss = substr($ss, 0, $i); // remove trail params

    // trim spaces, special (" = %22) and [] (%5B %5D) http://nigma.ru/?w[]=...
    $ss_test = str_replace('%2', '', str_replace('%5', '', $ss));
    $ss_test = substr($ss_test, stripos($ss_test, '%'));
   
    $ss = trim(urldecode($ss));

    if (stripos($ss_test, '%D1') !== 0
      && stripos($ss_test, '%D0') !== 0
      && stripos($ss_test, '%C3') === false)
      if (mb_substr_count($ss_test, '%D0') + mb_substr_count($ss_test, '%D1')
        < (strlen($ss_test) / 30))
          $ss = iconv("windows-1251", "UTF-8", $ss); // .' // '. $ss;
          //or equal: $ss = mb_convert_encoding($ss, "UTF-8", "windows-1251");
  }

  if (($i=strpos($ss, '&')) !== false) // for ya & google
    $ss = substr($ss, 0, $i); // remove trail params

  if (trim($ss) === '') {
    if (($i = stripos($referer, '&url=')) !== false)
      $ss = _statistics_ss(substr($referer, $i+5));
    if ($ss !== '' && ($i=strpos($ss, '&')) !== false) // for ya & google
      $ss = substr($ss, 0, $i); // remove trail params
  }

  return _statistics_test_keyboard_switch_mistake($ss, $ss_test);
}
83K
08 ноября 2012 года
hidogili
13 / / 06.11.2012
Благодарю. А как узнать, что в строке кракозябры? М.б. что нет русских букв? И тогда как это закодить?
4
08 ноября 2012 года
mike
3.7K / / 01.10.2002
Вариантов три:
  1. По полному словарю;
  2. По словарю слогов;
  3. По частотным характеристикам;
Третий вариант на коротких фразах не будет работать. Только если текст содержит количество символов по которым можно достаточно достоверно посчитать частоту "встречания" той или иной буквы.

В первом варианте придется все перекодировать и потом результат сравнивать со словарем. Будет работать только при целиком набранных словах. Сравнивать со словарем не так сложно, сложнее сгенерировать словарь со всеми словоформами. Тут можно посмотреть в сторону словарей ispelk и phpmorphy.

Имхо второй вариант самый простой. Почти все слова состоят из одних и тех же слогов, при этом в английской раскладке они больше похожи на бред. Составив словари реальных и бредовых слогов можно конвертировать пока пользователь все еще набирает слово (в этой задаче это не так важно). Например:

 
Код:
Как дела
==
Rfr ltkf
Мы имеем нормальны слоги:

 
Код:
ка == rf
де == lt
ла == kf
Дальше смотрим где нормальных словарных слогов больше, тот язык и выбираем.
83K
08 ноября 2012 года
hidogili
13 / / 06.11.2012
Благодарю, но по таким путям мне сложно ходить - познаний очень мало.
Другое дело взять готовое, хакнуть немного и т.д.
Да и задача - не все абсолютно случаи охватить, а хотя бы самые основные...

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

Ваш ответ

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