2010-11-29 11 views
39

Wie sollte ich einen Post-Titel in Ruby in einen Slug konvertieren?Ruby Beitrag Titel zu Slug

Der Titel kann beliebige Zeichen haben, aber ich möchte nur den Slug erlauben [a-z0-9-_] (Sollte es andere Zeichen erlauben?).

Also im Grunde:

  • downcase alle Buchstaben
  • konvertieren Räume Bindestriche
  • löschen irrelevante Zeichen
+0

* zusätzliche Worte entfernen, wenn der Titel länger als N Worte ist – Lassi

Antwort

71
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '') 

downcase macht es klein geschrieben. Die strip stellt sicher, dass es keine führenden oder nachgestellten Leerzeichen gibt. Die erste gsub ersetzt Leerzeichen durch Bindestriche. Die zweite gsub entfernt alle Nicht-Alpha-Nicht-Bindestrich-Nicht-Unterstreichungszeichen (beachten Sie, dass diese Menge sehr nahe an \W ist, enthält aber auch den Strich, weshalb es hier ausgeschrieben ist).

+0

Ihre Zeichenklasse prägnanter ausgedrückt werden könnte als '/ [^ \ w -] /'. –

+0

@Daniel, machte das Update. –

+1

Danke, Ben. Ich fügte etwas mehr Komplexität hinzu. \/und mehrere -'s in einer Zeile zu entfernen und sie vom Ende zu entfernen: 'slug = title.strip.downcase.gsub (/ [\ s \. \/\\] /, '-')./[^ \ w -] /, '') .gsub (/ [-_] {2,} /, '-') .gsub (/^[-_] /, '') .gsub (/ [- _] $ /, '') '. Ich habe aufgehört zu erkennen, dass es verdammt kompliziert ist, es perfekt zu machen. Außerdem ist "tr" schneller als "gsub", also ist es besser zu tun: 'tr ('', '-')' als 'gsub ('', '-')'. – ma11hew28

5

to_slug ist ein großartiges Rails-Plugin, das so ziemlich alles verarbeitet, einschließlich funky Zeichen, aber seine Implementierung ist sehr einfach. Chuck es auf String und Sie werden sortiert. Hier ist die Quelle kondensiert unten:

String.class_eval do 
    def to_slug 
    value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s 
    value.gsub!(/[']+/, '') 
    value.gsub!(/\W+/, ' ') 
    value.strip! 
    value.downcase! 
    value.gsub!(' ', '-') 
    value 
    end 
end 
+0

Ich verwende nicht Rails, aber das ist gut zu wissen. Vielen Dank! – ma11hew28

+4

@ JamieRumbelow- Ihr Beispielcode hatte einen Fehler. Sie müssen "Wert" explizit zurückgeben, da .gsub! gibt nil zurück, wenn keine Ersetzungen durchgeführt werden (z. B. "test" .to_slug "würde nil zurückgeben). Ich habe den Code für dich festgelegt. – Yarin

0

Ich mag FriendlyId, die selbsternannten „Swiss Army Bulldozer“ von Schnecken zu schaffen. https://github.com/norman/friendly_id

+2

Mit diesem Plugin, wie rufen Sie eine Methode, die Ihre Zeichenfolge Slug? – Ben

80

Ist das Rails?

string.parameterize 

Das ist es. Für noch kompliziertere Schläge, siehe ActsAsUrl. Es kann Folgendes tun:

"rock & roll".to_url => "rock-and-roll" 
"$12 worth of Ruby power".to_url => "12-dollars-worth-of-ruby-power" 
"10% off if you act now".to_url => "10-percent-off-if-you-act-now" 
"kick it en Français".to_url => "kick-it-en-francais" 
"rock it Español style".to_url => "rock-it-espanol-style" 
"tell your readers 你好".to_url => "tell-your-readers-ni-hao" 
+0

Es ist nicht Rails, aber es sieht so aus, als würde dieser Edelstein auch mit reinem Ruby funktionieren. Vielen Dank! Ich mag, wie es konvertiert und zu und, aber ich will es konvertieren/und. zu -. Es konvertiert sie in Schrägstrich bzw. Punkt. Um in diesem Fall die Dinge einfach zu halten, benötige ich keine zusätzlichen Edelsteine. Also habe ich meine Lösung auf "slug = title.strip.downcase.gsub (/ (&|&) /, 'und') .gsub (/ [\ s \. \/\\] /, '-') aktualisiert. Gsub (/ [^ \ w -] /, '') .gsam (/ [-_] {2,} /, '-'). gsub (/^[-_] /, '') .gsub (/ [ -_] $ /, '') '. – ma11hew28

Verwandte Themen