Quelle est la meilleure façon de nettoyer une chaîne pour le placement dans une URL, comme le nom de question sur le SO?

StackOverflow https://stackoverflow.com/questions/539920

  •  22-08-2019
  •  | 
  •  

Question

Je cherche à créer une chaîne d'URL comme celle utilise SO pour les liens aux questions. Je ne cherche pas à réécrire l'URL (mod_rewrite). Je cherche à générer le lien sur la page.

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 suis à la recherche de nettoyer tout ce qui est non alphanumérique tout en conservant l'URL lisible. J'ai créé ce qui suit, 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. couper
  2. remplacer les caractères alphanumériques non plus l'espace avec rien
  3. remplacez pas tout alphanumérique avec un tiret
  4. remplacer - avec -.
  5. strtolower()
  6. urlencode() -. Probablement pas nécessaire, mais juste pour faire bonne mesure
Était-ce utile?

La solution

Comme vous l'avez dit déjà, urlencode () n'est pas nécessaire dans ce cas et n'est trim (). Si je comprends bien, l'étape 4 est d'éviter plusieurs tirets de suite, mais il n'empêchera pas plus de deux tirets. D'autre part, des tirets reliant deux mots (comme dans « grande échelle ») sera supprimé par votre solution alors qu'ils semblent être conservés sur le SO.

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

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

  1. enlever tout caractère ni espace, tiret, ni alphanumérique
  2. remplacer un nombre consécutif d'espaces ou de tirets avec un simple tiret
  3. strtolower ()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top