Функция транслит


    Наверно каждый веб-программист хотя бы раз в жизни сталкивался с такой задачей, как перевод символов кириллицы, точнее их замена латинскими (английскими). Для этого в принципе понадобится одна стандартная PHP-функция.

    Translit It!


function translitIt($str) 
{
    $tr = array(
        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
        "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I",
        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
        "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
        "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
    );
    return strtr($str,$tr);
}
     Думаю не трудно понять суть работы этой функции.

    Транслитерация URL.


    В основном задача транслитерации в web-программировании становится при построении URL с заголовка страницы на русском языке. Поэтому необходимо только добавить свою интерпритацию для таких  символов как пробел и после "прогона" через эту функцию убрать остальные лишние символы. В результате получится код примерно такого вида:

function translitIt($str) 
{
    $tr = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
        "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", 
        " "=> "_", "."=> "", "/"=> "_"
    );
    return strtr($str,$tr);
}

if (preg_match('/[^A-Za-z0-9_\-]/', $urlstr)) {
    $urlstr = translitIt($urlstr);
    $urlstr = preg_replace('/[^A-Za-z0-9_\-]/', '', $urlstr);
}

    В результате $urlstr содержит валидный URL.


Раздел: Кодинг Рубрика: PHP


Добавлена: 03-04-2009 | Изменена: 03-04-2009 | Пользователем: admin | Просмотров: 49177

Комментарии

no 03-04-2009 10:13
А вы свой текст, случайно не прогоняли через функцию, которая убирает знаки препинания? ;)
admin 03-04-2009 15:12
Ага ","=>"" Зато вы теперь знаете как это сделать.
poikl 04-10-2009 08:06
спс все четко  ,добавте еще "ё"=>"e"  и ";"=>"" ":"=>""для  url
Программер 19-01-2010 05:02
Кстати можно всё сделать и свитчём большим)

admin 19-01-2010 08:46
Вы наверно сделали так когда-то, раз догадались такое предложить :)
kirilloid 25-01-2010 03:12
Инженеры велосипедных наук.
iconv("UTF-8""ISO-8859-1//TRANSLIT"$text)
admin 25-01-2010 04:13
kirilloid, с кем не бывает :)
Спасибо, будем попробовать.
arbrix 06-03-2010 04:53
решение с использованием iconv красивое, но у меня выдает:
Notice
: iconv() [function.iconv]: Detected an illegal character in input string
кто может посоветовать, что с этой бедой делать?
Сергей 27-03-2010 06:52
объясните мне а где тут ру текст вставлять, и как результат в базу записать, далек от этого но оч надо - СПАСИБО!
WEB-IGNITER 14-06-2010 10:27
КСТАТИ КИРИЛОИД ПРАВИЛЬНО НАПИСАЛ. Я ВТОРОЙ РАЗ СТЫКАЮСЬ С ПОИСКАМИ ТАКОЙ ФУНКЦИИ. И Я ЕЕ СНОВА НАШЕЛ. GOOGLE НАШЕЛ, НЕ ЯНДЕКС. ИБО ЯНДЕКС - ХУЙНЯ!
admin 14-06-2010 10:53
Кстати то что kirilloid сказал у меня не работает на локалхосте и VPS'е (OpenSUSE) (на dreamhost'е работает), согласен, может руки кривые что бы настроить локаль правильно, но на самом деле не кривые а просто не доходят, а старая добрая функция translitIt работает везде. 
WEB-IGNITER 14-06-2010 15:56
Поздравляю admin! У меня тоже ничего не работает iconv! Завтра придется вашу реализацию брать, плюс дописывать "є,ї,і". Поработав день с кодировками, понял, кокой-же РНР гавно!! Например iconv, strtolower, strtr так и не заработали в Юникодовом русско-украинском окружении. Всех придется перекрыть.  Будем на Python надеятся.
 (windows xp, xampp, netBeans)
admin 14-06-2010 16:18
Не ну тут придется повториться, php говно - не говно, руки ровные никто не отменял. На хостингах и на "преднастроенных" серверах iconv работает и все остальное. 
Вот я тоже хочу питон попробовать, но не из-за того что он может больше - он может по-другому. 
А в случае если на PHP не получается что то сделать, то тут и на другие решения не стоит надеется, если конечно дело не в неприязни (к пхп).
На всякий случай скажу, что этот сайт в дальнейших аргументах (если будут), в пример приводить не стоит - понятное дело недопиленный :) 
Dmitrii 06-10-2010 04:14
Спасибо за функцию
iconv
("UTF-8""ISO-8859-1//TRANSLIT"$text) - тупо не везде работает
Что касается
strtolower - попробуйте mb_strtolower
cicada 21-12-2010 09:49
А чтобы не изобретать велосипеды с UTF8, да и просто в свежих PHP, можно просто использовать функцию str_replace. Вот как то так:

function translite($string) {
        $rus = array("ё","й","ю","ь","ч","щ","ц","у","к","е","н","г","ш","з","х","ъ","ф","ы","в","а","п","р","о","л","д","ж","э","я","с","м","и","т","б","Ё","Й","Ю","Ч","Ь","Щ","Ц","У","К","Е","Н","Г","Ш","З","Х","Ъ","Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э","Я","С","М","И","Т","Б");
        $eng = array("yo","iy","yu","'","ch","sh","c","u","k","e","n","g","sh","z","h","'","f","y","v","a","p","r","o","l","d","j","е","ya","s","m","i","t","b","Yo","Iy","Yu","CH","'","SH","C","U","K","E","N","G","SH","Z","H","'","F","Y","V","A","P","R","O","L","D","J","E","YA","S","M","I","T","B");
        $string = str_replace($rus, $eng,  $string);
        /***
         функция str_replace находит значения в строке и заменяет их новой. здесь мы повторили весь алфавит, как видите  ::):
         ***/
        if(!empty($string)) {
            return $string;
        } // если строка не пуста, возвращаем строку
        else return("String empty/Строка пуста"); // а если пуста, орем во всю глотку xD
    }

Взял отсюда: http://jarmush.ru/node/166
admin 21-12-2010 11:58
cicada, что бы не писать такую ерунду, читать пост нужно и хотя бы немного разбираться в теме. Я имею ввиду что то типа "слышишь звон, не знаешь где он"..
alxkolm 23-12-2010 02:57
WEB-IGNITER: Поработав день с кодировками, понял, кокой-же РНР гавно!! Например iconv, strtolower, strtr так и не заработали в Юникодовом
русско-украинском окружении. Всех придется перекрыть.  Будем на Python
надеятся.

Когда руки не анатомически растут, то даже Python не поможет. С юникодными строками надо работать функциями с префиксом mb_
magasedoi 01-04-2011 00:40
<?php
/*******************************************************************************
    Filename                : str_lib.inc

    Created                    : 01 March 2010 (20:25:44)
    Created by                : atomheart

    Last Updated            : 14 March 2010 (17:47:08)
    Updated by                : atomheart

    Comments                : String Libriry
*******************************************************************************/   

    /** функции для безопасной обработки строк ********************************/
    /**************************************************************************/

    // константы, определяющие тип замены специальных символов html:
    define("STXT_HTML_NO", 0); // без замены спецсимволов
    define("STXT_HTML_ENT", 1); // преобразует все символы в соответствющие HTML сущности
    define("STXT_HTML_SPEC", 2); // преобразует специальные символы в соответствющие HTML сущности

    // экранирует специальные символы и меняет тип переносов на новую строку для текста:
    function safeText($str, $htmlspec = STXT_HTML_NO) {
        $text = stripslashes($str);
        // new line specialchar:
//        $text = str_replace(chr(13), "", $text);
//        $text = str_replace("n", "\n", $text);
        $text = str_replace(chr(13) . chr(10), "\n", $text);
        $text = str_replace(chr(10), "\n", $text);
        $text = str_replace(chr(13), "\n", $text);
        // slash correction:
        $text = str_replace("/", "/", $text);
        // html entities:
        $text = ($htmlspec == STXT_HTML_ENT) ? htmlentities($text, ENT_NOQUOTES) : $text;
        $text = ($htmlspec == STXT_HTML_SPEC) ? htmlspecialchars($text, ENT_NOQUOTES) : $text;
        // quotes:
        $text = str_replace('"', '"', $text);

        return $text;
    }

    function ru2lat($string) {
        // шипящие, сопящие и некоторые гласные:
        $rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
        $lat = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
        $string = str_replace($rus, $lat , $string);
        // остальной алфавит:
        $string = strtr($string,
            "АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ",
            "ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e");
        return($string);
    }

    // Таблица русского алфавита:
    $trans_table_ru = array(
        'А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е', 'Ё', 'ё',
        'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м',
        'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у',
        'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ы', 'ы', 'Э', 'э', 'Ч', 'ч', 'Ш', 'ш',
        'Щ', 'щ', 'Ю', 'ю', 'Я', 'я'
    );
    // Таблица латинского алфавита для адекватной замены букв (транслит):
    $trans_table_lat = array(
        'A', 'a', 'B', 'b', 'V', 'v', 'G', 'g', 'D', 'd', 'E', 'e', 'E', 'e',
        'J', 'j', 'Z', 'z', 'I', 'i', 'Y', 'y', 'K', 'k', 'L', 'l', 'M', 'm',
        'N', 'n', 'O', 'o', 'P', 'p', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u',
        'F', 'f', 'H', 'h', 'C', 'c', 'I', 'i', 'E', 'e',
        'Ch', 'ch', 'Sh', 'sh', 'Sh', 'sh', 'Yu', 'yu', 'Ya', 'ya'
    );

   
    function getTransName($str) {
        global $trans_table_ru, $trans_table_lat;
        // заменяем пробелы на знак подчерка:
        $str = str_replace(" ", "_", $str);
        // Убираем все не алфавитные символы, а также некоторые непроизносимые:
        $str = preg_replace('/W|Ь|ь|Ъ|ъ/i', '', $str);
        // убираем все дублирующиеся подчерки (нам они не нужны):
        $str = preg_replace('/_+/', '_', $str);
        // обрезаем строку:
        $str = trim($str, "_");
        // переводим русские символы в аналогичные латинские по определеным выше
        // правилам:
        $str = str_replace($trans_table_ru, $trans_table_lat, $str);
        // переводим в нижний регистр:
        $str = strtolower($str);

        return $str;
    }
    /**
     *    Внимание: в версии PHP <4.3.3 есть проблема с функцией str_replace.
     *    Эта проблема связана с пустыми элементами массивов.
     *    Есть фукнция strtr, предназначенная для замены пар символов, но для нее
     *    нужно определить массив с элементами 'Ш'->'SH'
     *    Зато проблем не будет и можно использовать маски для разных языков
     *    и случаев.
     *    В общем, нужно переписать!!!
     */             

    /**************************************************************************/

?>
Анонимус 25-05-2011 13:45

Блин. Вот ещё вариант для UTF-8.

Функцию translit оставить как есть (...strtr, etc) сохранить в отдельный файл в кодировке допустим CP1251.

а в начале обработки конвертировать строку из UTF-8 в CP1251, и в конце соответственно - обратно...

Хех, блин...

iryna 29-11-2011 10:11
Текст, который пишу на транслите, выдает мне теги <div>, как их удалить? не могу найти функцию хотябы уже замены на <p> .
admin 29-11-2011 21:59
Iryna, не знаю, это точно в вашем коде где-то. Если хотите просто убрать и не париться откуда он берется, можно сделать: 
- $str = strip_tags($str);
 что бы заменить на <p> сделайте $str = str_replace("<div>", "<p>", $str);
MAESTRO 18-01-2012 18:01
Э.. А зачем нам вообще в массив совать заглавные буквы, если транлитерация делается дл ЧПУ? Как бы совсем незачем. Следовательно перед определением массива вставляем $трока для замены = mb_strtolower($строка для замены); и далее заменяем только прописные. Ну и смотрим перед определением массива  сюда http://transliteration.ru/iso_for_url/ чтобы не по своим правилам делать, а как положено.


Оставить комментарий



капча

Комментарий будет опубликован после проверки модератором

Для подсветки синтаксиса используйте тэги:
<pre><code class="синтаксис" >код</code></pre>
Подерживаются следующие: cpp php javascript sql html-xml css ini

купить духи нина ричи в интернет магазине

Рубрики