2010-09-30 5 views
1

J'ai créé une fonction de nettoyage en PHP pour un projet permettant de construire des URL utiles à partir du contenu de la base de données. Il supprime tous les espaces et les caractères spéciaux, de sorte qu'une phrase comme "Mes albums Motörhead" devient dans l'URL my-motoerhead-albums. Cependant, il semble ne pas convertir correctement les trémas comme ö, ä, ü, etc, et je ne peux pas comprendre pourquoi.La fonction de nettoyage de PHP ne fonctionne pas correctement

Voici le code:

function clean($text) { 
$text = trim($text); 
$text = strtolower($text); 
$code_entities_match = array(
' ', '--', '"', '!', '@', '#', '$', '%', '^', '&', 
'*', '(', ')', '_', '+', '{', '}', '|', ':', '"',  
'<', '>', '?', '[', ']', '\\', ';', "'", ',', '.', 
'/', '*', '+', '~', '`', '=', '¡', '¿',  '´', '%C2%B4', 
'ä', 'ö', 'ü', 'ß', 'å', 'á', 'à', 
'ó', 'ò', 'ú', 'ù', 'í', 'é', 'è', 'ø', 'Þ', 'ð', '%C3%9E', '&thorn;' 
); 
$code_entities_replace = array(
'', '-', '', '', '', '', '', '', '', '',  
'', '', '', '', '', '', '', '', '', '', 
'', '', '', '', '', '', '', '', '', '',  
'', '', '', '', '', '', '', '', '', '',  
'ae', 'oe', 'ue', 'ss', 'aa', 'a', 'a', 'o', 'o', 'u', 'u', 'i', 'e', 'e', 'oe', 'th', 'th', 'th', 'th' 
); 
$text = str_replace($code_entities_match, $code_entities_replace, $text); 
return $text; 

}

+0

"Ne fonctionne pas" n'est pas une description correcte du problème. S'il vous plaît dites-nous ce qu'il fait ou ne fait pas exactement. –

+1

En outre, vous pouvez trouver de meilleures approches au problème ici: http://stackoverflow.com/questions/465990/how-to-handle-diacritics-accents-when-rewriting-pretty-urls –

Répondre

0

Ceci est la fonction que j'utilise pour construire des chaînes de sécurité url:

static public function slugify($text) 
{ 
    $text = str_replace(" ", "_", $text); 

    // replace non letter or digits by - 
    $text = preg_replace('~[^\\pL\d_]+~u', '-', $text); 

    // trim 
    $text = trim($text, '-'); 

    // transliterate 
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 

    // lowercase 
    $text = strtolower($text); 

    // remove unwanted characters 
    $text = preg_replace('~[^-\w]+~', '', $text); 

    if (empty($text)) 
    { 
    return 'n-a'; 
    } 

    return $text; 
} 

Il a été pris du tutoriel Jobeet de symfony.

+0

pourquoi avoir des séparateurs différents pour les espaces et non-lettres? il rend le résultat inutile laid. utilisez un tiret pour les deux et n'oubliez pas de supprimer les doublons. –

+0

J'ai besoin d'un résultat différent pour 'aa'bb' et' aa bb', donc les différents séparateurs. Les doublons sont une bonne prise, merci. – Maerlyn

+0

Merci! Je l'ai essayé, mais au lieu de convertir ma chaîne en "albums my-motoerhead", tout ce que j'ai obtenu est "my-mot" - il supprime tout après le tréma. Est-ce censé faire ça? – rayne

Questions connexes