Как дела
==
Rfr ltkf
Исправлять тексты, набранные при ошибочном состоянии переключения клавиатуры
PHP код вырезания поисковой строки из запросов с поисковиков хотелось бы и исправлять тексты, набранные при ошибочном состоянии переключения клавиатуры.
Поисковики то исправляют, но в GET остаются кракозябры.
Например: dct j cyf[ вместо "Все о снах"
М.б. есть готовые решения хотя бы только для русско-английской раскладки клавиатуры?
В дополнение к
Поисковики то исправляют, но в GET остаются кракозябры.
Например: dct j cyf[ вместо "Все о снах"
М.б. есть готовые решения хотя бы только для русско-английской раскладки клавиатуры?
Код:
$str=strtr($str,array(
'q'=>'й',
'w'=>'ц',
...
'.'=>'ю',
));
'q'=>'й',
'w'=>'ц',
...
'.'=>'ю',
));
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(
'_'=>'а', '_'=>'б', '_'=>'в', '_'=>'г', '_'=>'д', '_'=>'е', '_'=>'ё',
'_'=>'ж', '_'=>'з', '_'=>'и', '_'=>'й', '_'=>'к', '_'=>'л', '_'=>'м',
'_'=>'н', '_'=>'о', '_'=>'п', '_'=>'р', '_'=>'с', '_'=>'т', '_'=>'у',
'_'=>'ф', '_'=>'х', '_'=>'ц', '_'=>'ч', '_'=>'ш', '_'=>'щ', '_'=>'ъ',
'_'=>'ы', '_'=>'ь', '_'=>'э', '_'=>'ю', '_'=>'я',
'_'=>'А', '_'=>'Б', '_'=>'В', '_'=>'Г', '_'=>'Д', '_'=>'Е', '_'=>'Ё',
'_'=>'Ж', '_'=>'З', '_'=>'И', '_'=>'Й', '_'=>'К', '_'=>'Л', '_'=>'М',
'_'=>'Н', '_'=>'О', '_'=>'П', '_'=>'Р', '_'=>'С', '_'=>'Т', '_'=>'У',
'_'=>'Ф', '_'=>'Х', '_'=>'Ц', '_'=>'Ч', '_'=>'Ш', '_'=>'Щ', '_'=>'Ъ',
'_'=>'Ы', '_'=>'Ь', '_'=>'Э', '_'=>'Ю', '_'=>'Я' ));*/
}
* 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(
'_'=>'а', '_'=>'б', '_'=>'в', '_'=>'г', '_'=>'д', '_'=>'е', '_'=>'ё',
'_'=>'ж', '_'=>'з', '_'=>'и', '_'=>'й', '_'=>'к', '_'=>'л', '_'=>'м',
'_'=>'н', '_'=>'о', '_'=>'п', '_'=>'р', '_'=>'с', '_'=>'т', '_'=>'у',
'_'=>'ф', '_'=>'х', '_'=>'ц', '_'=>'ч', '_'=>'ш', '_'=>'щ', '_'=>'ъ',
'_'=>'ы', '_'=>'ь', '_'=>'э', '_'=>'ю', '_'=>'я',
'_'=>'А', '_'=>'Б', '_'=>'В', '_'=>'Г', '_'=>'Д', '_'=>'Е', '_'=>'Ё',
'_'=>'Ж', '_'=>'З', '_'=>'И', '_'=>'Й', '_'=>'К', '_'=>'Л', '_'=>'М',
'_'=>'Н', '_'=>'О', '_'=>'П', '_'=>'Р', '_'=>'С', '_'=>'Т', '_'=>'У',
'_'=>'Ф', '_'=>'Х', '_'=>'Ц', '_'=>'Ч', '_'=>'Ш', '_'=>'Щ', '_'=>'Ъ',
'_'=>'Ы', '_'=>'Ь', '_'=>'Э', '_'=>'Ю', '_'=>'Я' ));*/
}
Код:
/**
* 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);
}
* 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);
}
Благодарю. А как узнать, что в строке кракозябры? М.б. что нет русских букв? И тогда как это закодить?
- По полному словарю;
- По словарю слогов;
- По частотным характеристикам;
В первом варианте придется все перекодировать и потом результат сравнивать со словарем. Будет работать только при целиком набранных словах. Сравнивать со словарем не так сложно, сложнее сгенерировать словарь со всеми словоформами. Тут можно посмотреть в сторону словарей ispelk и phpmorphy.
Имхо второй вариант самый простой. Почти все слова состоят из одних и тех же слогов, при этом в английской раскладке они больше похожи на бред. Составив словари реальных и бредовых слогов можно конвертировать пока пользователь все еще набирает слово (в этой задаче это не так важно). Например:
Код:
Код:
ка == rf
де == lt
ла == kf
де == lt
ла == kf
Другое дело взять готовое, хакнуть немного и т.д.
Да и задача - не все абсолютно случаи охватить, а хотя бы самые основные...