Замена раскладки на PHP

PHP функции для исправление неправильной раскладки клавиатуры в тексте и использование их в поиске по сайту.

1
function switcher_ru($value)
{
	$converter = array(
		'f' => 'а',	',' => 'б',	'd' => 'в',	'u' => 'г',	'l' => 'д',	't' => 'е',	'`' => 'ё',
		';' => 'ж',	'p' => 'з',	'b' => 'и',	'q' => 'й',	'r' => 'к',	'k' => 'л',	'v' => 'м',
		'y' => 'н',	'j' => 'о',	'g' => 'п',	'h' => 'р',	'c' => 'с',	'n' => 'т',	'e' => 'у',
		'a' => 'ф',	'[' => 'х',	'w' => 'ц',	'x' => 'ч',	'i' => 'ш',	'o' => 'щ',	'm' => 'ь',
		's' => 'ы',	']' => 'ъ',	"'" => "э",	'.' => 'ю',	'z' => 'я',					

		'F' => 'А',	'<' => 'Б',	'D' => 'В',	'U' => 'Г',	'L' => 'Д',	'T' => 'Е',	'~' => 'Ё',
		':' => 'Ж',	'P' => 'З',	'B' => 'И',	'Q' => 'Й',	'R' => 'К',	'K' => 'Л',	'V' => 'М',
		'Y' => 'Н',	'J' => 'О',	'G' => 'П',	'H' => 'Р',	'C' => 'С',	'N' => 'Т',	'E' => 'У',
		'A' => 'Ф',	'{' => 'Х',	'W' => 'Ц',	'X' => 'Ч',	'I' => 'Ш',	'O' => 'Щ',	'M' => 'Ь',
		'S' => 'Ы',	'}' => 'Ъ',	'"' => 'Э',	'>' => 'Ю',	'Z' => 'Я',					

		'@' => '"',	'#' => '№',	'$' => ';',	'^' => ':',	'&' => '?',	'/' => '.',	'?' => ',',
	);

	$value = strtr($value, $converter);
	return $value;
}

echo switcher_ru('
	Hfcrkflrf rkfdbfnehs - cjukfitybt j cjjndtncndbb nbgjuhfabxtcrb[ cbvdjkjd 
	(,erd? wbah? pyfrjd ghtgbyfybz b/ l/) gbcvtyyjuj zpsrf rkfdbifv rkfdbfnehs/
');
PHP

Результат

Раскладка клавиатуры - соглашение о соответствии типографических символов 
(букв, цифр, знаков препинания и. д.) писменного языка клавишам клавиатуры.
2
function switcher_en($value)
{
	$converter = array(
		'а' => 'f',	'б' => ',',	'в' => 'd',	'г' => 'u',	'д' => 'l',	'е' => 't',	'ё' => '`',
		'ж' => ';',	'з' => 'p',	'и' => 'b',	'й' => 'q',	'к' => 'r',	'л' => 'k',	'м' => 'v',
		'н' => 'y',	'о' => 'j',	'п' => 'g',	'р' => 'h',	'с' => 'c',	'т' => 'n',	'у' => 'e',
		'ф' => 'a',	'х' => '[',	'ц' => 'w',	'ч' => 'x',	'ш' => 'i',	'щ' => 'o',	'ь' => 'm',
		'ы' => 's',	'ъ' => ']',	'э' => "'",	'ю' => '.',	'я' => 'z',

		'А' => 'F',	'Б' => '<',	'В' => 'D',	'Г' => 'U',	'Д' => 'L',	'Е' => 'T',	'Ё' => '~',
		'Ж' => ':',	'З' => 'P',	'И' => 'B',	'Й' => 'Q',	'К' => 'R',	'Л' => 'K',	'М' => 'V',
		'Н' => 'Y',	'О' => 'J',	'П' => 'G',	'Р' => 'H',	'С' => 'C',	'Т' => 'N',	'У' => 'E',
		'Ф' => 'A',	'Х' => '{',	'Ц' => 'W',	'Ч' => 'X',	'Ш' => 'I',	'Щ' => 'O',	'Ь' => 'M',
		'Ы' => 'S',	'Ъ' => '}',	'Э' => '"',	'Ю' => '>',	'Я' => 'Z',
		
		'"' => '@',	'№' => '#',	';' => '$',	':' => '^',	'?' => '&',	'.' => '/',	',' => '?',
	);

	$value = strtr($value, $converter);
	return $value;
}

echo switcher_en('
	Ф лунищфкв дфнщге шы фтн ызусшашс ьусрфтшсфдб мшыгфдб щк агтсешщтфд фккфтпуьуте 
	ща еру луныб дупутвыб щк лун-ьуфтштп фыыщсшфешщты (куызусешмудн) ща ф сщьзгеукю
');
PHP

Результат

A keyboard layout is any specific mechanical, visual, or functional arrangement 
of the keys, legends, or key-meaning associations (respectively) of a computer.
3

Самый простой способ – искать сразу по всем вариантам:

$search = 'Gjbcrjdjq pfghjc';
$search_ru = switcher_ru($search);
$search_en = switcher_en($search);

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
	SELECT 
		* 
	FROM 
		`prods` 
	WHERE 
		(`name` LIKE '%{$search}%' OR `text` LIKE '%{$search}%')
		OR (`name` LIKE '%{$search_ru}%' OR `text` LIKE '%{$search_ru}%')
		OR (`name` LIKE '%{$search_en}%' OR `text` LIKE '%{$search_en}%')
");
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

var_dump($result);
PHP

Второй – по условию отсутствии результатов.

$search = 'Gjbcrjdjq pfghjc';

$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `name` LIKE '%{$search}%' OR `text` LIKE '%{$search}%'");
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

if (empty($result)) {
	$search_ru = switcher_ru($search);
	
	$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `name` LIKE '%{$search_ru}%' OR `text` LIKE '%{$search_ru}%'");
	$sth->execute();
	$result = $sth->fetchAll(PDO::FETCH_ASSOC);
	
	if (empty($result)) {
		$search_en = switcher_en($search);
	
		$sth = $dbh->prepare("SELECT * FROM `prods` WHERE `name` LIKE '%{$search_en}%' OR `text` LIKE '%{$search_en}%'");
		$sth->execute();
		$result = $sth->fetchAll(PDO::FETCH_ASSOC);
	}
}

var_dump($result);
PHP
15.08.2019, обновлено 05.11.2021
10785
Предыдущая запись Транслитерация по ГОСТ
Следующая запись Запись в лог-файл в PHP

Комментарии 2

Александр Сигарёв Александр Сигарёв
5 августа 2020 в 14:46
Ошибка в switcher_ru:
'E' => 'Е'
Должно быть:
'T' => 'Е',

Ошибка в switcher_en:
'Е' => 'E',
Должно быть:
'Е' => 'T',
Snipp.ru Snipp.ru
18 сентября 2020 в 16:46
Спасибо, исправили

, чтобы добавить комментарий.

Другие публикации

Транслитерация по ГОСТ
PHP функции для транслита текста на русском языке по ГОСТ 7.79-2000 (ИСО 9-95) система «Б»
5061
+1
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
71775
+22
Раскрывающийся многоуровневый список
В данном примере описано как вывести многоуровневый список checkbox и radio button из БД с помощью PHP функций...
16570
+8
Коды клавиш клавиатуры для JQuery событий keydown, keyup и keypress
Список кодов клавиш стандартной клавиатуры на Windows и MacOS...
58969
0
Счетчик просмотров страниц с графиком
Для примера возьмем статейный сайт, на нём нужно сделать счетчик просмотров статей, с выводом результатов за день,...
19046
+23
PHP-класс обертка для PDO
Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание экземпляра класса.
22804
+11