Was ist ein guter vollständiger regulärer Ausdruck oder ein anderer Prozess, der den Titel annehmen würde:
Wie ändere ich einen Titel, um Teil der URL zu sein, wie z. B. Stapelüberlauf?
und verwandle es in
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
das wird in den SEO-freundlichen URLs auf Stack Overflow verwendet?
Die Entwicklungsumgebung, die ich verwende, ist Ruby on Rails , aber wenn es andere plattformspezifische Lösungen gibt (.NET, PHP, Django ), würde ich diese auch gerne sehen.
Ich bin sicher, dass ich (oder ein anderer Leser) auf einer anderen Plattform auf das gleiche Problem stoßen werde.
Ich verwende benutzerdefinierte Routen und möchte hauptsächlich wissen, wie die Zeichenfolge so geändert wird, dass alle Sonderzeichen entfernt werden, alles in Kleinbuchstaben geschrieben und alle Leerzeichen ersetzt werden.
quelle
Antworten:
So machen wir es. Beachten Sie, dass es wahrscheinlich mehr Randbedingungen gibt, als Sie auf den ersten Blick erkennen.
Dies ist die zweite Version, die für 5x mehr Leistung abgerollt wurde (und ja, ich habe sie verglichen). Ich dachte, ich würde es optimieren, weil diese Funktion hunderte Male pro Seite aufgerufen werden kann.
Zeigen Sie den Revisionsverlauf dieses Beitrags an, um die vorherige Version des ersetzten Codes anzuzeigen (der jedoch funktional gleichwertig und 5x schneller ist) (klicken Sie auf den Datumslink).
Den
RemapInternationalCharToAscii
Quellcode der Methode finden Sie auch hier .quelle
RemapInternationalCharToAscii()
Funktion ist da meta.stackexchange.com/questions/7435/…if (prevdash) sb.Length -= 1; return sb.ToString();
anstelle der letztenif
Aussage.sb.Length == maxlen break;
ist fehlerhaft, wenn das Zeichen auf maxLenght-1 "ß" ist und es in "ss" konvertiert wird,sb.Length == maxlene
wird es niemals wahr sein. Es ist besser, stattdessen zu testen(sb.Length > = maxlen)
.Hier ist meine Version von Jeffs Code. Ich habe folgende Änderungen vorgenommen:
Die Fallkonvertierung ist jetzt auch optional.
Für weitere Details, die Unit-Tests und eine Erklärung, warum das URL- Schema von Facebook etwas intelligenter ist als Stack Overflows, habe ich eine erweiterte Version davon in meinem Blog .
quelle
if (i == maxlen) break;
,if (sb.Length == maxlen) break;
damit Sie, wenn Sie eine Zeichenfolge mit vielen Leerzeichen / ungültigen Zeichen übergeben, immer noch einen Slug mit der gewünschten Länge erhalten, während der Code in seiner jetzigen Form möglicherweise endet massives Abschneiden (z. B. den Fall betrachten, in dem Sie mit 80 Leerzeichen beginnen ...). Ein grober Benchmark von 10.000.000 Iterationen gegen Jeffs Code zeigte, dass er ungefähr gleich schnell ist.Sie möchten eine benutzerdefinierte Route einrichten, um die URL auf den Controller zu verweisen, der sie verarbeitet. Da Sie Ruby on Rails verwenden, finden Sie hier eine Einführung in die Verwendung der Routing-Engine.
In Ruby benötigen Sie einen regulären Ausdruck, wie Sie ihn bereits kennen. Hier ist der reguläre Ausdruck, den Sie verwenden können:
quelle
Sie können diese JavaScript- Funktion auch zur In-Form-Generierung der Slugs verwenden (diese basiert auf Django / wird von Django kopiert ):
quelle
Hier ist die PHP-Funktion in WordPress, die das macht ... Ich würde denken, dass WordPress eine der beliebtesten Plattformen ist, die ausgefallene Links verwendet.
Diese Funktion sowie einige der unterstützenden Funktionen finden Sie in wp-includes / formatting.php.
quelle
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
Sie diewp-includes/formatting.php
Datei immer noch inWenn Sie Rails Edge verwenden, können Sie sich auf Inflector.parametrize verlassen - hier das Beispiel aus der Dokumentation:
Auch wenn Sie mit exotischeren Zeichen wie Akzenten (éphémère) in früheren Versionen von Rails umgehen müssen, können Sie eine Mischung aus PermalinkFu und DiacriticsFu verwenden :
quelle
Ich bin nicht mit Ruby on Rails vertraut, aber das Folgende ist (ungetesteter) PHP-Code. Sie können dies wahrscheinlich sehr schnell in Ruby on Rails übersetzen, wenn Sie es nützlich finden.
Ich hoffe das hilft.
quelle
Ich habe nicht viel mit Ruby oder Rails zu tun, aber in Perl würde ich Folgendes tun:
Ich habe gerade einen kurzen Test gemacht und es scheint zu funktionieren. Hoffentlich ist dies relativ einfach in Ruby zu übersetzen.
quelle
T-SQL-Implementierung, angepasst von dbo.UrlEncode :
quelle
Ich weiß, dass es eine sehr alte Frage ist, aber da die meisten Browser jetzt Unicode-URLs unterstützen, habe ich in XRegex eine großartige Lösung gefunden , die alles außer Buchstaben konvertiert (in allen Sprachen in '-').
Dies kann in mehreren Programmiersprachen erfolgen.
Das Muster ist
\\p{^L}+
und dann müssen Sie es nur verwenden, um alle Nicht-Buchstaben durch '-' zu ersetzen.Arbeitsbeispiel in node.js mit xregex- Modul.
quelle
Angenommen, Ihre Modellklasse verfügt über ein title-Attribut, können Sie die to_param-Methode im Modell einfach wie folgt überschreiben:
Diese Railscast-Episode enthält alle Details. Sie können auch sicherstellen, dass der Titel nur gültige Zeichen enthält, indem Sie Folgendes verwenden:
quelle
Brians Code in Ruby:
downcase
in Kleinbuchstaben verwandelt sich die Zeichenfolge,strip
entfernt führende und nachfolgende Leerzeichen, der erstegsub
Anruf g lobally Unter Instituten Räume mit Bindestrichen und die zweite alles entfernt, der kein Brief oder ein Bindestrich ist.quelle
Es gibt ein kleines Ruby on Rails-Plugin namens PermalinkFu , das dies tut. Die Escape-Methode führt die Umwandlung in eine Zeichenfolge durch, die für eine URL geeignet ist . Schauen Sie sich den Code an. Diese Methode ist recht einfach.
Um Nicht- ASCII- Zeichen zu entfernen , wird die iconv lib verwendet, um von 'utf-8' nach 'ascii // ignore // translit' zu übersetzen. Leerzeichen werden dann in Bindestriche umgewandelt, alles wird verkleinert usw.
quelle
Sie können die folgende Hilfsmethode verwenden. Es kann die Unicode-Zeichen konvertieren.
quelle
Hier ist meine (langsamere, aber spaßige) Version von Jeffs Code:
Mein Teststring:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
quelle
Die Stackoverflow-Lösung ist großartig, aber moderne Browser (wie üblich ohne IE) können jetzt gut mit der utf8-Codierung umgehen:
Also habe ich die vorgeschlagene Lösung aktualisiert:
Vollständiger Code auf Pastebin
Bearbeiten: Hier ist der Code für die
RemapInternationalCharToAscii
Methode (der im Pastebin fehlt).quelle
Mir hat die Art und Weise gefallen, wie dies ohne Verwendung regulärer Ausdrücke gemacht wird , deshalb habe ich es auf PHP portiert. Ich habe gerade eine Funktion
is_between
zum Überprüfen von Zeichen hinzugefügt :quelle
Jetzt können alle Browser die utf8-Codierung gut verarbeiten, sodass Sie die WebUtility.UrlEncode- Methode verwenden können, die der von @giamin verwendeten HttpUtility.UrlEncode ähnelt, jedoch außerhalb einer Webanwendung funktioniert.
quelle
Ich habe den Code nach TypeScript portiert. Es kann leicht an JavaScript angepasst werden.
Ich füge
.contains
demString
Prototyp eine Methode hinzu. Wenn Sie auf die neuesten Browser oder ES6 abzielen, können Sie diese.includes
stattdessen verwenden.quelle
Nein nein Nein. Sie sind alle so sehr falsch. Abgesehen von den Diakritika-Fu-Sachen kommen Sie dorthin, aber was ist mit asiatischen Charakteren (Schande für Ruby-Entwickler, dass sie ihre Nihonjin nicht in Betracht ziehen Brüder ).
Firefox und Safari zeigen beide Nicht-ASCII-Zeichen in der URL an und sehen ehrlich gesagt großartig aus. Es ist schön, Links wie ' http://somewhere.com/news/read/ ' zu unterstützen '.
Hier ist also ein PHP-Code, der das macht, aber ich habe ihn gerade geschrieben und ihn nicht auf Stress getestet.
Beispiel:
Ausgänge: コ リ and -und- ト ー and and -und- ア ー ノ ル ド
Das '-und-' liegt daran, dass & in '-und-' geändert wird.
quelle