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):
<?php
var_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.Transliterator::transliterate
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Transliterator::transliterate
Референца за `transliterator.transliterate.php` со подобрена типографија и навигација.
Transliterator::transliterate
transliterator_transliterate
(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)
Transliterator::transliterate -- transliterator_transliterate — (PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)
= NULL
Напиши целосна ознака на елемент
$string, int $start = 0, int $end = -1): string|falseПроцедурален стил
— Постави го нивото на ограничување|string
$transliterator,string
$string,int
$start = 0,int
$end = -1): string|false
Транслитерирај стринг
Параметри
transliterator-
Трансформира стринг или дел од него користејќи ICU транслитератор. — Постави го нивото на ограничување или string Во процедурална верзија, или — Постави го нивото на ограничување од кој
string-
може да се изгради.
start-
Стрингот што треба да се трансформира.
end-
Индекс на почеток (во UTF-16 кодни единици) од кој стрингтот ќе почне да се трансформира, вклучително. Индексирањето започнува од 0. Текстот пред тоа ќе остане како што е.
Вратени вредности
Индекс на крај (во UTF-16 кодни единици) до кој стрингтот ќе се трансформира, ексклузивно. Индексирањето започнува од 0. Текстот по тоа ќе остане како што е. false при неуспех.
Примери
Трансформираниот стринг при успех, или
<?php
$s = "\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059";
echo transliterator_transliterate("Hex-Any/Java", $s), "\n";
//now the reverse operation with a supplementary character
$supplChar = html_entity_decode('𝄞');
echo mb_strlen($supplChar, "UTF-8"), "\n";
$encSupplChar = transliterator_transliterate("Any-Hex/Java", $supplChar);
//echoes two encoded UTF-16 code units
echo $encSupplChar, "\n";
//and back
echo transliterator_transliterate("Hex-Any/Java", $encSupplChar), "\n";
?>Горниот пример ќе прикаже нешто слично на:
お早うございます 1 \uD834\uDD1E 𝄞
Види Исто така
- Пример #1 Конвертирање на избегани UTF-16 кодни единици - Земи ја последната порака за грешка
- Transliterator::getErrorMessage() - Приватен конструктор за да се спречи инстанцирање
Белешки од корисници 4 белешки
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/517914
Also 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"You can create slugs easily with:
<?php
function 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!");
?>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...