/**
* Permet de transformer une chaine de caractères en sont équivalent "slug"
* @param $str : Chaine à transformer
* @return Slug de la chaine
**/
function str2slug($str) {
    $slug = str_replace("'", '-', $str);
    $slug = preg_replace('#?,\.;/:§!%µ\*¨\^£$¤&~"\#{\(\|`_\\@°\)\]=}€]#', '', $slug);
    $slug = htmlentities($slug, ENT_NOQUOTES, 'utf-8');
    $slug = preg_replace('#\&([A-Za-z])(?:grave|acute|circ|tilde|uml|ring|cedil)\;#', '\1', $slug);
    $slug = preg_replace('#\&([A-Za-z]{2})(?:lig)\;#', '\1', $slug);
    $slug = str_replace(' ', '-', $slug);
    $slug = str_replace('--', '-', $slug);
    $slug = strtolower($slug);
    $slug = trim($slug, '-');
    return $slug;
}

str2slug("Test | d'une phrase vraiment bien longue et compliquée pour vous montrer que ma fonction str2slug() retourne bien une chaine de caractres sous forme de slug");

Me retourne :

test-d-une-phrase-vraiment-bien-longue-et-compliquee-pour-vous-montrer-que-ma-fonction-str2slug-retourne-bien-une-chaine-de-caractres-sous-forme-de-slug

Pas de problème ? mais vous remarquerez ma fautes ou il manque un "è" dans le mot "caractres"
Tout simplement car dès que j'ajoute un "è" dans ma chaine alors plus rien ne m'es retourné =(

Une idée ? et peut être des améliorations ?

1 réponse


Typhon
Auteur
Réponse acceptée

Y a des fois comme a ou on a du mal =S ^^
J'ai finis par corriger mon problème tout seul.

Pour ceux que ça intéresse voilà la version Finale.

/**
* Permet de transformer une chaine de caractères en sont équivalent "slug"
* @param string $str : Chaine à transformer
* @return string : Slug de la chaine
**/
function str2slug($str) {
    $str = htmlentities($str, ENT_NOQUOTES, 'utf-8');
    $str = preg_replace('#\&([A-Za-z])(?:grave|acute|circ|tilde|uml|ring|cedil)\;#', '\1', $str);
    $str = preg_replace('#\&([A-Za-z]{2})(?:lig)\;#', '\1', $str);
    $str = str_replace("'", '-', $str);
    $str = str_replace(' ', '-', $str);
    $str = preg_replace('#[^A-Za-z0-9-]#', '', $str);
    $str = str_replace('--', '-', $str);
    $str = strtolower($str);
    $str = trim($str, '-');
    return $str;
}

Testé et approuvé (Enfin j’espère) =D

EDIT : Function v2

function slug($str) {
    // Convertit tous les caractères en entités html
    $str = htmlentities($str, ENT_NOQUOTES, 'utf-8');
    // Déspécialise tous les caractères déspécialisables (ex. é->e, œ -> oe, ç->c ou encore ñ->n)
    $str = preg_replace('/\&([A-Za-z])(?:grave|acute|circ|tilde|uml|ring|cedil)\;/', '$1', $str);
    $str = preg_replace('/\&([A-Za-z]{2})(?:lig)\;/', '$1', $str);
    // Supprime tous les caractères non déspécialisables (ex. & = &)
    $str = preg_replace('/\&([A-Za-z]*)\;/', '', $str);
    // Remplace tous autres caractères différent d'une lettre, d'un chiffre ou du délimiteur par le délimiteur
    $str = preg_replace('/[^A-Za-z0-9-]/', '-', $str);
    // Supprime les doublons de délimiteur
    $str = preg_replace('/[-]{2,}/', '-', $str);
    // Convertit la chaine en minuscule
    $str = strtolower($str);
    // Suprime les délimiteurs en début et fin de chaine
    $str = trim($str, '-');
    return $str;
}