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!");
?>
Transliterator::transliterate
transliterator_transliterate
(PHP >= 5.4.0, PECL intl >= 2.0.0)
Transliterator::transliterate -- transliterator_transliterate — Translittère une chaîne de caractères
Description
Style orienté objet
$subject
[, int $start
[, int $end
]] )Style procédural
$transliterator
, string $subject
[, int $start
[, int $end
]] )Transforme une chaîne de caractères ou seulement une partie en utilisant un translittérateur ICU.
Liste de paramètres
-
transliterator -
Dans la version procédurale, soit un Transliterator soit une chaîne de caractères depuis laquelle un Transliterator peut être construit.
-
subject -
La chaîne de caractères à transformer.
-
start -
L'index de départ (en unité UTF-16) depuis lequel la chaîne commencera à être transformée, inclusif. Les indexes commencent à 0. Le texte avant cet index restera inchangé.
-
end -
L'index de fin (en unité UTF-16) indiquant la fin de la transformation, exclusif. Les indexes commencent à 0. Le texte après cet index restera inchangé.
Valeurs de retour
La chaîne de caractères transformée en cas de succès,
ou FALSE si une erreur survient.
Exemples
Exemple #1 Conversion des échappements en unité UTF-16
<?php
$s = "\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059";
echo transliterator_transliterate("Hex-Any/Java", $s), "\n";
//maintenant, l'opération inverse avec un caractère supplémentaire
$supplChar = html_entity_decode('𝄞');
echo mb_strlen($supplChar, "UTF-8"), "\n";
$encSupplChar = transliterator_transliterate("Any-Hex/Java", $supplChar);
//affiche 2 unités UTF-16 encodés
echo $encSupplChar, "\n";
//et le retour...
echo transliterator_transliterate("Hex-Any/Java", $encSupplChar), "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
お早うございます 1 \uD834\uDD1E 𝄞
Voir aussi
- Transliterator::getErrorMessage() - Récupère le dernier message d'erreur
- Transliterator::__construct() - Constructeur privé pour interdire l'instantiation
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.
OOP version :
<?php
$str = 'àáâãäçèéêëìíîïñòóôõöùúûüýÿ
ÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ';
$rule = 'NFD; [:Nonspacing Mark:] Remove; NFC';
$myTrans = Transliterator::create($rule);
echo $myTrans->transliterate($str);
//aaaaaceeeeiiiinooooouuuuyy
//AAAAACEEEEIIIINOOOOOUUUUY
?>
