2009-02-12 7 views
6

Je cherche à créer une chaîne d'URL comme celle utilisée par SO pour les liens vers les questions. Je ne cherche pas à réécrire l'url (mod_rewrite). Je cherche à générer le lien sur la page.Quelle est la meilleure façon de nettoyer une chaîne pour la placer dans une URL, comme le nom de la question sur SO?

Exemple: Le nom de question est:

Is it better to use ob_get_contents() or $text .= ‘test’; 

L'URL finit par être:

http://stackoverflow.com/questions/292068/is-it-better-to-use-obgetcontents-or-text-test 

La partie que je suis intéressé est:

is-it-better-to-use-obgetcontents-or-text-test 

Donc, fondamentalement, je Je cherche à nettoyer tout ce qui n'est pas alphanumérique tout en gardant l'URL lisible. J'ai ce qui suit créé, mais je ne suis pas sûr que ce soit la meilleure façon ou si elle couvre toutes les possibilités:

$str = urlencode(
    strtolower(
    str_replace('--', '-', 
    preg_replace(array('/[^a-z0-9 ]/i', '/[^a-z0-9]/i'), array('', '-'), 
    trim($urlPart))))); 

Donc, en gros:

  1. garniture
  2. remplacer tout non alphanumériques plus l'espace avec rien
  3. puis remplacer tout ce qui n'est pas alphanumérique avec un tiret
  4. remplacer - avec -.
  5. strtolower()
  6. urlencode() - probablement pas nécessaire, mais juste pour faire bonne mesure.
+0

** Dupliquer ** - Gumbo

Répondre

5

Comme vous l'avez déjà souligné, urlencode() n'est pas nécessaire dans ce cas et trim() non plus. Si je comprends bien, l'étape 4 est d'éviter plusieurs tirets d'affilée, mais cela n'empêchera pas plus de deux tirets. D'autre part, les tirets reliant deux mots (comme dans "à grande échelle") seront supprimés par votre solution alors qu'ils semblent être conservés sur SO.

Je ne suis pas sûr que ce soit vraiment la meilleure façon de le faire, mais voici ma suggestion:

$str = strtolower( 
    preg_replace(array('/[^a-z0-9\- ]/i', '/[ \-]+/'), array('', '-'), 
    $urlPart)); 

Alors:

  1. enlever tout caractère ni espace, tiret, ni alphanumérique
  2. Remplacer un nombre d'espaces ou de tirets consécutifs par un seul tiret
  3. strtolower()
+0

Je ferais quand même le trim() à cause d'éventuels espaces supplémentaires. –

+0

Oui, vous avez probablement raison. Vous ne voudriez pas un tiret avant ou arrière. Merci d'avoir accepté ma réponse de toute façon. –

+0

-1 car il ne s'agit pas de caractères accentués, sry. – fabrik

Questions connexes