Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Поиск разных вариантов транслитерации русских текстов (ФИО) латиницей для выборок в MySQL

Anna | 31.05.2014 | нет комментариев

Собственно, столкнулся с тривиальной задачей — есть база, в которой есть масса данных ФИО, написанных латиницей. Нередко довольно неграмотно и непредсказуемо транслитерировано. Как бы бы и есть ГОСТ 7.79 (ISO 9), но на практике его вдалеке не неизменно соблюдают.
Задача — есть БД с записями (как правило, ФИО) латиницей. Дрянной латиницей. Требуется по русской подстроке поиска в вэб-приложении предпочесть из БД (MySQL) записи, схоже транслитерированные на латиницу.


Первая мысль — написать функцию, которая возвращала бы массив, содержащий допустимые написания начальной фразы латиницей.

Исходник 1, дозволяющий взглянуть как может быть транслитерирована тривиальная строка

print_r (r2e ("Дюже простая фраза на русском языке"));

function r2e ($txt)
 {
  $r=array(mb_strtolower($txt,"windows-1251"));
  $r=r2es($r,"/кс/i",array("x","ks","cs"));
  $r=r2es($r,"/ей/i",array("ey","ei"));
  $r=r2es($r,"/ов/i",array("ov","off"));
  $r=r2es($r,"/а/i",array("a"));
  $r=r2es($r,"/б/i",array("b"));
  $r=r2es($r,"/в/i",array("v","w"));
  $r=r2es($r,"/г/i",array("g"));
  $r=r2es($r,"/д/i",array("d"));
  $r=r2es($r,"/е/i",array("e"));
  $r=r2es($r,"/ё/i",array("yo","jo"));
  $r=r2es($r,"/ж/i",array("zh","z"));
  $r=r2es($r,"/з/i",array("z","s"));
  $r=r2es($r,"/и/i",array("i"));
  $r=r2es($r,"/й/i",array("j","y"));
  $r=r2es($r,"/к/i",array("k","c"));
  $r=r2es($r,"/л/i",array("l"));
  $r=r2es($r,"/м/i",array("m"));
  $r=r2es($r,"/н/i",array("n"));
  $r=r2es($r,"/о/i",array("o"));
  $r=r2es($r,"/п/i",array("p"));
  $r=r2es($r,"/р/i",array("r"));
  $r=r2es($r,"/с/i",array("s"));
  $r=r2es($r,"/т/i",array("t"));
  $r=r2es($r,"/у/i",array("u"));
  $r=r2es($r,"/ф/i",array("f"));
  $r=r2es($r,"/х/i",array("h","kh"));
  $r=r2es($r,"/ц/i",array("c","ts"));
  $r=r2es($r,"/ч/i",array("ch"));
  $r=r2es($r,"/ш/i",array("sh"));
  $r=r2es($r,"/щ/i",array("shch","sch","sh"));
  $r=r2es($r,"/ъ/i",array(""));
  $r=r2es($r,"/ы/i",array("y"));
  $r=r2es($r,"/ь/i",array(""));
  $r=r2es($r,"/э/i",array("e"));
  $r=r2es($r,"/ю/i",array("u","yu","ju"));
  $r=r2es($r,"/я/i",array("ya","ja"));
  return $r;
 }

function r2es ($var, $pattern, $splits)
 {
  $sp=array(); $nsp=array();
  foreach ($var as $v)
    if (preg_match($pattern,$v)) foreach ($splits as $split) $sp=array_merge($sp,array(preg_replace($pattern,$split,$v)));
    else $nsp=array_merge($nsp,array($v));
  return array_merge($sp,$nsp);
 }

Содержимое выходного массива из примера 1

Array
(
[0] => ochen prostaya fraza na russkom yazyke
[1] => ochen prostaja fraza na russkom jazyke
[2] => ochen prostaya fraza na russcom yazyce
[3] => ochen prostaja fraza na russcom jazyce
[4] => ochen prostaya frasa na russkom yasyke
[5] => ochen prostaja frasa na russkom jasyke
[6] => ochen prostaya frasa na russcom yasyce
[7] => ochen prostaja frasa na russcom jasyce
)

как бы и отлично получилось, даже познавательно, но полученный массив необходимо ещё и склеить в довесок к запросу в виде

$sqlstr = "SELECT <smth> FROM <smwhr> WHERE searchField LIKE '%" . implode("%' OR searchField LIKE '%",$result) . "%'";
либо, если необходимо точное совпадение
$sqlstr = "SELECT <smth> FROM <smwhr> WHERE searchField LIKE '" . implode("' OR searchField LIKE '",$result) . "'";

Ну и технически настораживает, что запрос SQL абсолютно легко может удлинниться в разы.
Но с минимальными доработками будет трудиться фактически с любым движком БД.

Решение задачи оказалось гораздо суперкомпактнее — MySQL поддерживает взамен «SELECT… WHERE field LIKE ‘pattern’» продвинутые конструкции «SELECT… WHERE field REGEXP ‘regexp’», дозволяющие исполня

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB