Qu'est-ce qu'une bonne expression régulière complète ou un autre processus qui prendrait le titre:
Comment modifier un titre pour qu'il fasse partie de l'URL comme Stack Overflow?
et le transformer en
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
qui est utilisé dans les URL optimisées pour le référencement sur Stack Overflow?
L'environnement de développement que j'utilise est Ruby on Rails , mais s'il existe d'autres solutions spécifiques à la plate-forme (.NET, PHP, Django ), j'aimerais aussi les voir.
Je suis sûr que je (ou un autre lecteur) rencontrerai le même problème sur une plate-forme différente en aval.
J'utilise des itinéraires personnalisés et je veux surtout savoir comment modifier la chaîne pour que tous les caractères spéciaux soient supprimés, tout est en minuscules et tous les espaces sont remplacés.
Réponses:
Voici comment nous procédons. Notez qu'il y a probablement plus de conditions de bord que vous ne le pensez à première vue.
Il s'agit de la deuxième version, déroulée pour 5 fois plus de performances (et oui, je l'ai testée). J'ai pensé que je l'optimiserais car cette fonction peut être appelée des centaines de fois par page.
Pour voir la version précédente du code que celui-ci a remplacé (mais est fonctionnellement équivalent à, et 5 fois plus rapide), consultez l'historique des révisions de ce message (cliquez sur le lien de date).
En outre, le
RemapInternationalCharToAscii
code source de la méthode peut être trouvé ici .la source
RemapInternationalCharToAscii()
fonction est là meta.stackexchange.com/questions/7435/…if (prevdash) sb.Length -= 1; return sb.ToString();
au lieu de la dernièreif
déclaration.sb.Length == maxlen break;
est bogué si le signe sur maxLenght-1 est "ß" il est converti en "ss"sb.Length == maxlene
ne sera jamais vrai, il vaut mieux plutôt le tester(sb.Length > = maxlen)
.Voici ma version du code de Jeff. J'ai apporté les modifications suivantes:
La conversion de cas est désormais également facultative.
Pour plus de détails, les tests unitaires et une explication de la raison pour laquelle le schéma d' URL de Facebook est un peu plus intelligent que Stack Overflows, j'ai une version étendue de cela sur mon blog .
la source
if (i == maxlen) break;
pour être à laif (sb.Length == maxlen) break;
place, de sorte que si vous passez une chaîne avec beaucoup d'espaces / caractères invalides, vous pouvez toujours obtenir un slug de la longueur souhaitée, tandis que le code tel qu'il se présente pourrait finir la tronquer massivement (par exemple, considérez le cas où vous commencez avec 80 espaces ...). Et un repère approximatif de 10 000 000 d'itérations par rapport au code de Jeff a montré qu'il était à peu près à la même vitesse.Vous souhaiterez configurer un itinéraire personnalisé pour pointer l' URL vers le contrôleur qui le gérera. Puisque vous utilisez Ruby on Rails, voici une introduction à l'utilisation de leur moteur de routage.
Dans Ruby, vous aurez besoin d'une expression régulière comme vous le savez déjà et voici l'expression régulière à utiliser:
la source
Vous pouvez également utiliser cette fonction JavaScript pour la génération in-form des slugs (celle-ci est basée sur / copiée depuis Django ):
la source
Pour faire bonne mesure, voici la fonction PHP dans WordPress qui le fait ... Je pense que WordPress est l'une des plateformes les plus populaires qui utilise des liens fantaisistes.
Cette fonction ainsi que certaines des fonctions de support peuvent être trouvées dans wp-includes / formating.php.
la source
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
trouver lewp-includes/formatting.php
fichier dansSi vous utilisez Rails edge, vous pouvez compter sur Inflector.parametrize - voici l'exemple de la documentation:
De plus, si vous devez gérer des caractères plus 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 :
la source
Je ne connais pas Ruby on Rails, mais ce qui suit est du code PHP (non testé). Vous pouvez probablement traduire cela très rapidement en Ruby on Rails si vous le trouvez utile.
J'espère que ça aide.
la source
Je ne parle pas beaucoup de Ruby ou de Rails, mais en Perl, voici ce que je ferais:
Je viens de faire un test rapide et cela semble fonctionner. Espérons que cela soit relativement facile à traduire en Ruby.
la source
Implémentation T-SQL, adaptée de dbo.UrlEncode :
la source
Je sais que c'est une question très ancienne, mais comme la plupart des navigateurs prennent désormais en charge les URL unicode, j'ai trouvé une excellente solution dans XRegex qui convertit tout sauf les lettres (dans toutes les langues en «-»).
Cela peut être fait dans plusieurs langages de programmation.
Le motif est
\\p{^L}+
et il vous suffit de l'utiliser pour remplacer toutes les lettres non par «-».Exemple de travail dans node.js avec le module xregex .
la source
En supposant que votre classe de modèle possède un attribut title, vous pouvez simplement remplacer la méthode to_param dans le modèle, comme ceci:
Cet épisode de Railscast a tous les détails. Vous pouvez également vous assurer que le titre ne contient que des caractères valides en utilisant ceci:
la source
Le code de Brian, en Ruby:
downcase
transforme la chaîne en minuscules,strip
supprime les espaces avant et, le premiergsub
appel g lobally sous espaces stitutes avec des tirets, et le second supprime tout ce qui est pas une lettre ou un tiret.la source
Il y a un petit plugin Ruby on Rails appelé PermalinkFu , qui fait cela. La méthode d'échappement effectue la transformation en une chaîne adaptée à une URL . Jetez un œil au code; cette méthode est assez simple.
Pour supprimer les caractères non ASCII , il utilise la bibliothèque iconv pour traduire en 'ascii // ignore // translit' de 'utf-8'. Les espaces sont ensuite transformés en tirets, tout est déclassé, etc.
la source
Vous pouvez utiliser la méthode d'assistance suivante. Il peut convertir les caractères Unicode.
la source
Voici ma version (plus lente, mais amusante à écrire) du code de Jeff:
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 source
La solution stackoverflow est excellente, mais un navigateur moderne (à l'exception d'IE, comme d'habitude) gère désormais bien l'encodage utf8:
J'ai donc mis à jour la solution proposée:
Code complet sur Pastebin
Edit: voici le code de la
RemapInternationalCharToAscii
méthode (qui manque dans la boîte à pâte).la source
J'ai aimé la façon dont cela se fait sans utiliser d' expressions régulières , donc je l'ai porté sur PHP. Je viens d'ajouter une fonction appelée
is_between
pour vérifier les caractères:la source
Désormais, tous les navigateurs gèrent bien l'encodage utf8, vous pouvez donc utiliser la méthode WebUtility.UrlEncode , comme HttpUtility.UrlEncode, utilisée par @giamin, mais son travail en dehors d'une application Web.
la source
J'ai porté le code sur TypeScript. Il peut facilement être adapté à JavaScript.
J'ajoute une
.contains
méthode auString
prototype, si vous ciblez les derniers navigateurs ou ES6, vous pouvez utiliser à la.includes
place.la source
Non non Non. Vous vous trompez tous tellement. Sauf pour les trucs diacritiques-fu, vous y arrivez, mais qu'en est-il des personnages asiatiques (dommage aux développeurs Ruby de ne pas considérer leur nihonjin frères ).
Firefox et Safari affichent tous deux des caractères non ASCII dans l' URL , et franchement, ils ont fière allure. Il est agréable de prendre en charge des liens comme « http://somewhere.com/news/read/ お 前 た ち は ア ホ じ ゃ な い か い ».
Voici donc du code PHP qui le fera, mais je viens de l'écrire et je ne l'ai pas testé.
Exemple:
Sorties: コ リ ン -et- ト ー マ ス -et- ア ー ノ ル ド
Le «-et-» est dû au fait que & «est changé en« -et- ».
la source