| SiteMaker.Ru | http://sitemaker.ru/develop/php/translit/ |
Транслитерация и детранслитерация на РНР | |
|
Приветствую моих многоуважаемых читателей. Сегодня мы поговорим о не очень сложной, но довольно полезной и интересной теме, а именно о воплощении технологии перевода текста в транслит, и обратно. Безусловно, как базовый язык мы возмем великий русский язык, и попытаемся перевести его на латиницу.
Что ж, сначала нужно определиться с алфавитом, на котором мы будем основываться во время написания приложения. Вариантов транслита бывает много, и конечно воплотить их все просто невозможно, так как иногда транслит не поддается страндартизации, и акцент идет на знание языка и ориентировку в контексте сказаного. Лично я использую следующую таблицу символов: 'yii'=>'ы', 'ji'=>'й', 'yo'=>'ё', 'ya'=>'я', 'shc'=>'щ', 'sh'=>'ш', 'ea'=>'я', 'ii'=>'й', 'zh'=>'ж', 'ch'=>'ч', 'iy'=>'ю', 'ts'=>'ц', 'u'=>'у', 'w'=>'в', 'v'=>'в', 'i'=>'и', 'y'=>'у', 'd'=>'д', 't'=>'т', 'b'=>'б', 'p'=>'п', 'n'=>'н', 'f'=>'ф', '\''=>'ь', '\''=>'ъ', 'z'=>'з', 'l'=>'л', 'k'=>'к', 's'=>'с', 'm'=>'м', 'r'=>'р', 's'=>'с', 'h'=>'х', 'j'=>'ж', 'g'=>'г', '_'=>'', 'a'=>'а' Так же, есть некоторые моменты. К примеру, если название является контекстным, и не подлежит траслитерации, то перед ним нужно ставить символ '->', который будет говорить интерпретатору о том, что это слово не подлежит транслитерации. Так же в моей интерпретации транслита, символы `ь` и `ъ` будут интерпретироваться как `-`. Вот и все, это были все специфические моменты. Теперь давайте напишим небольшое приложение, которое как раз и будет производить транслитерацию текста:
<?php
function Translit($text){
$data=explode(" ",$text);
$alphas=array(
'yii'=>'ы',
'ji'=>'й',
'yo'=>'ё',
'ya'=>'я',
'shc'=>'щ',
'sh'=>'ш',
'ea'=>'я',
'ii'=>'й',
'zh'=>'ж',
'ch'=>'ч',
'iy'=>'ю',
'ts'=>'ц',
'u'=>'у',
'w'=>'в',
'v'=>'в',
'i'=>'и',
'y'=>'у',
'd'=>'д',
't'=>'т',
'b'=>'б',
'p'=>'п',
'n'=>'н',
'f'=>'ф',
'\''=>'ь',
'\''=>'ъ',
'z'=>'з',
'l'=>'л',
'k'=>'к',
's'=>'с',
'm'=>'м',
'r'=>'р',
's'=>'с',
'h'=>'х',
'j'=>'ж',
'g'=>'г',
'_'=>'',
'a'=>'а'
);
$total='';
foreach($data as $k=>$v){
foreach($alphas as $id=>$value){
if(strcasecmp($v,$value) AND !eregi("->",$v)){
$v=str_replace($value,$id,$v);
}elseif(eregi("->",$v)){
$v=str_replace("->","",$v);
}
}
$total.=$v." ";
}
return $total;
}
?>
Теперь давайте немного подробней поговорим об исходнике.
Сначала мы разбиваем текст по отдельным словам, то есть по пробелам, для более удобного перевода. После мы инициируем массив со значениями алфавита. Далее мы создаем переменную $total, которая и будет содержать обработанный текст. После этого идет сам процесс обработки. Для этого мы производим перебор нашего массива слов, и обрабатываем каждый элемент по очереди. Первым нашим шагом будет разбивка массива символов на латиницу и кириллицу. Этот метод очень удобен, так как для перевода транслитерации в детранслитерацию, нам всего лишь нужно поменять порядок перебора. Теперь если слово содержит тот или иной символ таблицы символов, мы заменяем его альтернативой. Если будет найдена конструкция `->`, то мы удаляем ее и не производим обработки. После этого мы просто составляем строку $total, и возвращаем ее в качестве результата работы функции. Как видите, особой сложности в этом нет. Все довольно просто. Вот мы и прошли первый этап разработки, теперь нам еще осталось создать процедуру детранслитерации, а то есть перевода латиницы в кириллицу. Как я уже говорил, это делается очень просто. Для этого мы введем необязательный параметр в функцию Translit(), а именно $type. Параметр $type будет носить тип производимых действий (в латиницу или обратно). Что ж, вот что получилось у меня:
<?php
function Translit($text,$type='de'){
$data=explode(" ",$text);
if(count($data)==''){
return '';
}
$alphas=array(
'yii'=>'ы',
'ji'=>'й',
'yo'=>'ё',
'ya'=>'я',
'shc'=>'щ',
'sh'=>'ш',
'ea'=>'я',
'ii'=>'й',
'zh'=>'ж',
'ch'=>'ч',
'iy'=>'ю',
'ts'=>'ц',
'u'=>'у',
'w'=>'в',
'v'=>'в',
'i'=>'и',
'y'=>'у',
'd'=>'д',
't'=>'т',
'b'=>'б',
'p'=>'п',
'n'=>'н',
'f'=>'ф',
'\''=>'ь',
'\''=>'ъ',
'z'=>'з',
'l'=>'л',
'k'=>'к',
's'=>'с',
'm'=>'м',
'r'=>'р',
's'=>'с',
'h'=>'х',
'j'=>'ж',
'g'=>'г',
'_'=>'',
'a'=>'а'
);
$total='';
foreach($data as $k=>$v){
if(preg_match("/^[a-zA-Z]*/",$v)){
foreach($alphas as $id=>$value){
if($type=='de'){
if(strcasecmp($v,$id) AND !eregi("->",$v)){
$v=str_replace($id,$value,$v);
}elseif(eregi("->",$v)){
$v=str_replace("->","",$v);
}
}elseif($type='translit'){
if(strcasecmp($v,$value) AND !eregi("->",$v)){
$v=str_replace($value,$id,$v);
}elseif(eregi("->",$v)){
$v=str_replace("->","",$v);
}
}
}
}
$total.=$v." ";
}
return $total;
}
?>
Как видите, для детранслитеризации мы просто во время перебора делаем проверку параметра, и в соответствии от его значения мы делаем замену (id на value, или value на id соответственно).
Я считаю, что на этом можно закончить.
Потестируйте, подлатайте где посчитаете нужным - все, как говорится, в ваших руках!
| |
| Автор: К.Карпенко | Дата публикации: 15.09.2006 |
© 2000-2010 SiteMaker.Ru
All rights reserved.