2009-11-25 3 views
4

Je veux générer automatiquement une URL lisible de tout texte naturel, comme celui-ci:Y at-il une fonction PHP pour générer une URL jolie et valide à partir d'un texte naturel?

Dernier article: A propos des lettres allemandes - Manipulation AOU et ß!

idéal serait de passer à cet

derniers-article-about-allemand-lettres-manutention-aou-et-ss.html

Il devrait fonctionner pour tous les latins langues et je veux éviter toute fuite.

Je suppose que cela pourrait être réalisé par des expressions régulières, mais il y a peut-être déjà une fonction standard disponible dans PHP/PEAR/PECL.

Répondre

11

Qu'est-ce que vous cherchez est slugify votre texte.

Vous pouvez trouver des petits bouts de code sur Internet comme celui-ci qui fera l'affaire:

/** 
* Modifies a string to remove al non ASCII characters and spaces. 
*/ 
static public function slugify($text) 
{ 
    // replace non letter or digits by - 
    $text = preg_replace('~[^\\pL\d]+~u', '-', $text); 

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

    // transliterate 
    if (function_exists('iconv')) 
    { 
     $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; 
} 

De here.

+4

@Guillaume - grande trouvaille. J'ai inséré le code au cas où il disparaîtrait jamais de snipplr. –

+0

Vous avez totalement raison, je n'y ai pas pensé, merci. –

+2

Notez qu'en plus de cela, vous devriez faire une vérification pour vous assurer que le titre généré est unique dans votre système. Et sinon, ajoutez un identifiant unique quelconque. Je le mentionne parce que cela m'a coûté un lourd mal de tête il n'y a pas si longtemps :) – pixeline

0

Créez un tableau avec vos caractères spéciaux, passez-les en boucle en utilisant str_replace et remplacez vos valeurs par la valeur désirée.

0

Vous devez absolument remplacer les caractères spéciaux en premier. Ensuite, vous pouvez utiliser preg_replace et faire quelque chose comme

$url = preg_replace("#[^a-zA-Z0-9_-]#", "_", $string); 
3

Je ne pense pas qu'il y ait une fonction pour le faire, j'ai récemment créé ce que:

function fix_url($word) { 
    /** 
    * whilst the descriptor in the url will be for SEO  
    * purposes only, we need to ensure it doesn't break 
    * the URI rules http://www.faqs.org/rfcs/rfc2396.html 
    */ 

    // convert to lower case 
    $word=strtolower($word); 

    // define illegal/replacement characters 
    $illegal = array("ä","ö","ü","ß"); 
    $replace = array("a","o","u","ss"); 
    $word = str_replace($illegal, $replace, $word); 

    // remove & for and 
    $word=str_replace("&","and",$word); 

    // remove a space for - 
    $word=str_replace(" ","-",$word); 

    // and replace all non alphanumeric characters or a dash 
    $word=ereg_replace("[^A-Za-z0-9-]", "", $word); 
    return $word; 
} 

J'ai inclus un exemple de remplacer un caractère illégal d'un coffre-fort.

J'ai testé ce code et il retourne latest-article-about-german-letters---handling-aou-and-ss donc évidemment il y a encore quelques réglages à faire (voir le ---), mais je suis sûr que ce sera facile à adapter.

0

J'utilise ce qui suit pour générer un nom de fichier à partir d'une chaîne:

function format_filename($str) 
{ 
    $str = preg_replace('/[^A-Za-z0-9- ]/', $seperator, $str); 
    $str = str_replace($seperator, '', $str); 
    $str = str_replace(' ', $seperator, $str); 
    return strtolower($str); 
} 

Il était rapide et sale et je suis sûr que certains des autres gens sympas sur ici peut améliorer cet extrait de code.

1

Depuis un certain temps, j'utilise avec succès utf8_to_ascii de la bibliothèque PHP UTF8. Fonctionne pour tout texte UTF-8 (non-latin inclus).

Questions connexes