Ruby titre du post pour slug
Comment dois-je convertir un post à ce titre à une limace en Ruby?
Le titre peut avoir tout les personnages, mais je ne veux le slug pour permettre [a-z0-9-_]
(Doit-il permettre à tous les autres personnages?).
Donc en gros:
- downcase toutes les lettres
- convertir les espaces pour les traits d'union
- supprimer étrangères caractères
- * supprimer d'autres termes, si le titre est plus long que de N mots
Vous devez vous connecter pour publier un commentaire.
downcase
rend minuscules. Lestrip
permet de s'assurer il n'y a pas d'espaces avant ni après. La premièregsub
remplace les espaces par des traits d'union. La deuxièmegsub
supprime tous les non-alpha non-dash non-caractères de soulignement (à noter que cette série est très proche de\W
mais comprend le tableau de bord, ce qui est pourquoi il est énoncée ici)./[^\w-]/
.slug = title.strip.downcase.gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
. J'ai arrêté après s'être rendu compte que c'est vachement compliqué pour la rendre parfaite. Aussi,tr
est plus rapide quegsub
, de sorte qu'il est mieux de le faire:tr(' ', '-')
quegsub(' ', '-')
.slug = title.downcase.gsub('/[\s.\/_]/, ' ').squeeze(' ').strip.gsub(/[^\w-]/, '').tr(' ', '-')
. Cette première tourne tous les espaces,.
,/
, et '_' espaces. Puis elle serre les espaces (toutes les séquences de 2 ou plusieurs espaces de devenir un seul), puis il supprime les espaces (supprime attaque et de fuite des espaces), puis il convertit les espaces restants de retour en pointillés.gsub
traitement contretr
, vous êtes vraiment juste de parler de cycles de processeur -- nanosecondes, vraiment. À moins de créer des centaines de milliers de messages par seconde, que la différence de vitesse fera absolument aucune différence. Ce que vous devez prendre en compte est le style personnel et la clarté du code. Dans ce cas, jetr
peut encore mieux, mais pour ces deux raisons, pas parce que c'est plus rapide.slug = title.parameterize
comme Mark Thomas souligné. Même si vous n'êtes pas à l'aide de rails, vous pouvez obtenir le même soutien de l'appui actif de gem par:require 'active_support'; $KCODE = 'UTF8';
slug = title.downcase.gsub('/[\s.\/_]/, ' ').squeeze(' ').strip.tr(' ', '-').gsub(/[^\w-]/, '')
"hello---world"
quandtitle = "hello - world"
, mais je veux qu'il revienne"hello-world"
. En outre, de supprimer l'apostrophe après la première ouverture de la parenthèse.gsub
,squeeze
, ettr
pour obtenir le résultat souhaité. Ou vous pouvez coller avec ce que vous avaient déjà travaillé =).gsub(/[^\w-]/, '')
la partie avant de la bande de la chaîne. De cette façon, cette expression sera de gérer les chaînes comme' ? ? hello ? ? world ? ?'
correctementEst-ce les Rails?
Que c'est. Pour encore plus sophistiqué qui s'affrontent, voir ActsAsUrl. Il peut effectuer les opérations suivantes:
slug = title.strip.downcase.gsub(/(&|&)/, ' and ').gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
.to_slug est un grand Rails plugin qui gère à peu près tout, y compris funky personnages, mais sa mise en œuvre est très simple. Chuck sur Chaîne et vous allez être triés. Voici le code source condensée en bas:
value
, parce que .gsub! renvoie zéro lorsque aucune substitution n'est effectuée (par exemple,"test".to_slug
serait de retour nul). J'ai corrigé le code pour vous.J'ai utilisé ce joyau.C'est simple mais très utile.
https://rubygems.org/gems/string_helpers
J'aime FriendlyId, l'auto-proclamé "de l'Armée Suisse Bulldozer" de la création de limaces. https://github.com/norman/friendly_id