Comment Débordement de Pile générer son SEO-friendly URLs?
Ce qui est un bon expression régulière ou un autre processus qui prendrait le titre:
Comment pouvez-vous changer le titre à la partie de l'URL comme un Débordement de Pile?
et de le transformer en
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
qui est utilisé dans le SEO-friendly URLs sur Pile Overflow?
L'environnement de développement que j'utilise est Ruby on Rails, mais si il y en a d'autres plate-forme de solutions spécifiques (.NET, PHP, Django), je serais ravi de voir ceux qui sont trop.
Je suis sûr que je (ou un autre lecteur) rencontrerez le même problème sur une autre plate-forme en bas de la ligne.
Je suis en utilisant des itinéraires personnalisés, et j'ai surtout envie de savoir comment modifier la chaîne de caractères spéciaux sont supprimés, tout en minuscules, et tous les espaces sont remplacés.
- Ce sujet de drôles de personnages? Qu'allez-vous faire à propos de ces? Le tréma? La ponctuation? Ces le besoin d'être considéré. En gros, je voudrais utiliser une liste blanche d'approche, par opposition à la liste noire des approches ci-dessus: Décrire les caractères qui vous permettra, quels personnages vous permettra de convertir (à quoi?) et puis changer le reste de quelque chose de significatif (""). Je doute que vous pouvez faire cela en une seule regex... Pourquoi ne pas simplement faire une boucle par les personnages?
- Doit être migré vers meta; que la question et la réponse à la fois spécifiquement traitent avec tant de mise en œuvre, et l'on a accepté la réponse est à partir de @JeffAtwood.
- Pensez-vous que Jeff n'est pas permis à certains non-méta-réputation? La question est de savoir comment peut-on faire quelque chose comme cela", et non "comment est-ce fait ici".
- Ce n'est pas Jeff l'obtention de certains non-méta-réputation (combien de points de réputation qu'il a, c'est vraiment pas ma préoccupation); la question du corps citées StackOverflow de la mise en œuvre d'où la justification pour qu'il soit sur meta.
Vous devez vous connecter pour publier un commentaire.
Voici comment nous le faisons. Notez qu'il ya probablement plus de conditions de bords que vous vous rendez compte au premier coup d'œil.
C'est la deuxième version, déroulé pour 5x plus de performance (et oui, je comparés il). J'ai pensé à optimiser, car cette fonction peut être appelée plusieurs centaines de fois par page.
Pour voir la version précédente du code l'a remplacé, mais est fonctionnellement équivalent, et 5 fois plus rapide), de consulter l'historique des révisions de ce post (cliquez sur le lien).
Aussi, le
RemapInternationalCharToAscii
méthode de code source peut être trouvé ici.RemapInternationalCharToAscii()
fonction est-il meta.stackexchange.com/questions/7435/...if (prevdash) sb.Length -= 1; return sb.ToString();
au lieu de la dernièreif
déclaration.sb.Length == maxlene
ne sera jamais vrai, c'est mieux, au lieu de test pour(sb.Length > = maxlen)
.if (i == maxlen) break;
êtreif (sb.Length == maxlen) break;
à la place?Voici ma version de Jeff code. J'ai fait les modifications suivantes:
Le cas de conversion est maintenant aussi disponible en option.
Pour plus de détails, les tests unitaires, et une explication de pourquoi Facebook's URL schéma est un peu plus intelligent que les Débordements de Pile, j'ai une version étendue de ce sur mon blog.
if (i == maxlen) break;
êtreif (sb.Length == maxlen) break;
au lieu de cela, de sorte que si vous passez une chaîne de caractères avec beaucoup d'espaces/caractères non valides que vous pouvez toujours obtenir une limace de la longueur désirée, tandis que le code, comme il se pourrait massivement tronquant (par exemple, considérons le cas où vous commencez avec 80 espaces...). Et un brut de référence de 10 000 000 d'itérations contre Jeff code ont montré qu'il est à peu près la même vitesse.Vous voulez mettre en place un itinéraire personnalisé pour pointer le URL pour le contrôleur, qui s'en occupera. Puisque vous êtes à l'aide de Ruby on Rails, voici un introduction en utilisant leur moteur de routage.
En Ruby, vous aurez besoin d'une expression régulière comme vous le savez déjà et c'est ici l'expression régulière à utiliser:
Vous pouvez également utiliser cette JavaScript fonction dans le formulaire de génération de la limace (ceci est basé sur la/copié à partir de Django):
Pour faire bonne mesure, voici la fonction PHP dans WordPress qui fait... je pense que WordPress est l'un des plus populaires de plates-formes qui utilise fantaisie liens.
Cette fonction ainsi que certaines de ces fonctions peuvent être trouvés dans wp-includes/formatting.php.
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
et de trouver lawp-includes/formatting.php
fichier dansSi vous êtes à l'aide de Rails de bord, vous pouvez compter sur Inflecteur.paramétrer - voici l'exemple de la documentation:
Aussi, si vous avez besoin de manipuler des caractères exotiques tels que les accents (éphémère) dans la version précédente de Rails, vous pouvez utiliser un mélange de PermalinkFu et DiacriticsFu:
Je ne suis pas familier avec Ruby on Rails, mais la suite est (non testé) du code PHP. Vous pouvez probablement traduire très rapidement à Ruby on Rails si vous le trouvez utile.
J'espère que cette aide.
Je n'ai pas beaucoup à propos de Ruby ou Rails, mais en Perl, c'est ce que je ferais:
J'ai juste fait un test rapide et il semble fonctionner. J'espère que c'est relativement facile à traduire à Ruby.
T-SQL de mise en œuvre, adapté de dbo.UrlEncode:
En supposant que votre modèle de classe possède un attribut title, vous pouvez simplement remplacer le to_param la méthode dans le modèle, comme ceci:
Cette Railscast épisode a tous les détails. Vous pouvez également vous assurer que le titre ne contient que des caractères valides en utilisant ceci:
Je sais que c'est une très vieille question, mais puisque la plupart des navigateurs maintenant en charge unicode url j'ai trouvé une excellente solution dans XRegex qui convertit tout sauf des lettres (dans toutes les langues à '-').
Qui peut être fait de plusieurs langages de programmation.
Le motif est
\\p{^L}+
et ensuite, vous avez juste besoin de l'utiliser pour remplacer toutes les lettres non à '-'.Exemple de travail en node.js avec xregex module.
De Brian code en Ruby:
downcase
transforme la chaîne en minuscules,strip
supprime attaque et de fuite des espaces, le premiergsub
appel globally sousstitutes les espaces par des tirets, et le second supprime tout ce qui n'est pas une lettre ou un tiret.Il y a une petite Ruby on Rails plugin appelé PermalinkFu, qui fait cela. Le méthode d'échappement la transformation en une chaîne de caractères qui est adapté pour un URL. Regardez le code; cette méthode est assez simple.
Supprimer non-ASCII caractères qu'il utilise la fonction iconv lib traduire 'ascii//ignorer//translit' de 'utf-8'. Les espaces sont alors transformées en tirets, tout est downcased, etc.
Vous pouvez utiliser la méthode d'assistance. Il peut convertir les caractères Unicode.
Voici mon (plus lent, mais le plaisir d'écrire) de la version de Jeff code:
Ma chaîne de test:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
La stackoverflow solution est grande, mais navigateur moderne (à l'exclusion c'est à dire, comme d'habitude) gèrent bien l'encodage utf8:
Donc j'ai mis à jour la solution proposée:
Plein de Code sur Pastebin
Edit: Voici le code pour
RemapInternationalCharToAscii
méthode (ce qui manque dans le pastebin).J'ai aimé la manière dont c'est fait sans l'aide de les expressions régulières, donc je l'ai porté sous PHP. J'ai juste ajouté une fonction appelée
is_between
de caractères de contrôle:Maintenant tous les navigateurs poignée bien l'encodage utf8, de sorte que vous pouvez utiliser WebUtility.UrlEncode Méthode , comme son HttpUtility.UrlEncode utilisé par @giamin mais son travail à l'extérieur d'une application web.
Non, non, non. Vous êtes toutes très mal. Sauf pour les signes diacritiques-fu choses, vous êtes d'en arriver là, mais ce que sur les caractères Asiatiques (honte sur Ruby développeurs à ne pas considérer leur nihonjin frères).
Firefox et Safari la fois pour l'affichage des caractères non-ASCII dans le URL, et franchement ils ont fière allure. Il est agréable à prendre en charge les liens comme"http://somewhere.com/news/read/お前たちはアホじゃないかい'.
Donc voici une partie du code PHP qui vais le faire, mais je viens d'écrire et n'en ai pas le stress de le tester.
Exemple:
Sorties:
コリン-et-トーマス-et-アーノルド
L' "- et - " est parce que &'s get changé" - et -".
J'ai porté le code de la Machine. Il peut facilement être adapté à JavaScript.
Je suis l'ajout d'un
.contains
méthode à laString
prototype, si vous ciblez les navigateurs les plus récents ou ES6 vous pouvez utiliser.includes
à la place.