Transliterator::transliterate

transliterator_transliterate

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::transliterate -- transliterator_transliterateТранслитерировать строку

Описание

Объектно-ориентированный стиль

public Transliterator::transliterate(string $string, int $start = 0, int $end = -1): string|false

Процедурный стиль

transliterator_transliterate(
    Transliterator|string $transliterator,
    string $string,
    int $start = 0,
    int $end = -1
): string|false

Преобразовывает строку или её часть, используя транслитератор ICU.

Список параметров

transliterator

В процедурном варианте, Transliterator или строка, из которой может быть собран объект Transliterator.

string

Строка для транслитерации.

start

Начальный индекс, включительно, (в кодовых единицах UTF-16), с которого начинается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст до этой позиции останется как есть.

end

Начальный индекс, не включая, (в кодовых единицах UTF-16), которым заканчивается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст с этой позиции останется как есть.

Возвращаемые значения

Возвращает преобразованную строка в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Конвертация экранированной UTF-16 строки

<?php
$s
= "\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059";
echo
transliterator_transliterate("Hex-Any/Java", $s), "\n";

//теперь обратная операция с дополнительным символом
$supplChar = html_entity_decode('&#x1D11E;');
echo
mb_strlen($supplChar, "UTF-8"), "\n";
$encSupplChar = transliterator_transliterate("Any-Hex/Java", $supplChar);
//вывод двух кодированных UTF-16 символов
echo $encSupplChar, "\n";
//и назад
echo transliterator_transliterate("Hex-Any/Java", $encSupplChar), "\n";
?>

Вывод приведённого примера будет похож на:

お早うございます
1
\uD834\uDD1E
𝄞

Смотрите также

Добавить

Примечания пользователей 5 notes

up
38
simonsimcity at gmail dot com
12 years ago
I pretty much like the idea of hdogan, but there's at least one group of characters he's missing: ligature characters.They're at least used in Norwegian and I read something about French, too ... Some are just used for styling (f.e. fi)Here's an example that supports all characters (should at least, according to the documentation):<?phpvar_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', "A æ Übérmensch på høyeste nivå! И я люблю PHP! fi"));// string(41) "a ae ubermensch pa hoyeste niva! i a lublu php! fi"?>In this example any character will firstly be converted to a latin character. If that's finished, replace all latin characters by their ASCII replacement.
up
11
simonsimcity at gmail dot com
11 years ago
Sorry, for posting it again, but I found a bug in my code:If you have a character, like the cyrillic ь (a soft-sign - no sound), the "Any-Latin" would translate it to a prime-character, and the "Latin-ASCII" doesn't touch prime-characters. Therefore I added an option to remove all characters, that are higher than \u0100.Here's my new code, including an example:var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0100-\u7fff] remove',    "A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi"));// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi"Another approach, I found quite helpful (if you by no way want to remove characters ...), try to use iconv() in addition. This surely will just return ASCII characters.See: http://stackoverflow.com/a/3542748/517914Also an example here:var_dump(iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", transliterator_transliterate('Any-Latin; Latin-ASCII',    "A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi"));// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est'. fi"
up
12
hdogan at gmail dot com
12 years ago
You can create slugs easily with:<?phpfunction slugify($string) {    $string = transliterator_transliterate("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", $string);    $string = preg_replace('/[-\s]+/', '-', $string);    return trim($string, '-');}echo slugify("Я люблю PHP!");?>
up
-2
Anonymous
8 years ago
There are some possibly undesirable conversions with ASCII//TRANSLIT//IGNORE or your users may require some custom stuff.You might want to run a substitution up front for certain things, such as when you want 3 letter ISO codes to replace currency symbols. £ transliterates to "lb", for example, which is incorrect since it's a currency symbol, not a weight symbol (#). ASCII//TRANSLIT//IGNORE does a great job within the realm of possibility :-)When it doesn't do something you want it to, you can set up a CSV with one replacement per line and run a function like:    function stripByMap($inputString, $mapFile)    {        $csv = file($mapFile);        foreach($csv as $line)        {            $arrLine = explode(',', trim($line));            $inputString = str_replace($arrLine[0],$arrLine[1],$inputString);        }        return $inputString;    }or you can write some regexes. Transliterating using ASCII//TRANSLIT//IGNORE  works so well that your map probably won't be very long...
up
-5
jinmoku at hotmail dot com
14 years ago
OOP version :<?php$str = 'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ';$rule = 'NFD; [:Nonspacing Mark:] Remove; NFC';$myTrans = Transliterator::create($rule); echo $myTrans->transliterate($str); //aaaaaceeeeiiiinooooouuuuyy//AAAAACEEEEIIIINOOOOOUUUUY?>
To Top