2013-02-26 7 views
7
def titleize(string) 
    string.split(" ").map {|word| word.capitalize}.join(" ") 
end 

Questo titolo significa ogni singola parola, ma come faccio a catturare determinate parole che non voglio maiuscole?Ruby: Titleize: Come faccio a ignorare parole più piccole come 'e', ​​'the', 'o, ecc.

ie) Jack e Jill

E prega di non utilizzare Regex.

UPDATE:

Sto avendo difficoltà a fare questo lavoro di codice: l'ho preso per stampare un array di parole tutte le protezioni, ma non senza la lista qui sotto.

words_no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 

def titleize(string) 
cap_word = string.split(" ").map {|word| word.capitalize} 

cap_word.include?(words_no_cap) 

end 
+1

Si crea quello che viene chiamato un elenco di "stop-parola", che contiene le parole che non si desidera elaborare. Può essere un array, un set, un hash o un'espressione regolare. Regex è un modo comune per gestire il problema come è un hash, in quanto entrambi sono molto veloci. Inoltre, non rifiutare le risposte dicendo "NON UTILIZZARE ...". Forniamo quelle che riteniamo le migliori soluzioni a un problema e sei libero di non implementarle. –

+0

possibile duplicato di [Uso di title case con Ruby 1.8.7] (http://stackoverflow.com/questions/13117340/using-title-case-with-ruby-1-8-7) – oldergod

+1

"DO NOT USE Regex" sembra controverso nel codice di esempio dato, dato che 'stringa.split' in effetti usa la regex. Probabilmente vuoi un minimo già preparato per l'uso, quindi dai un'occhiata a [titleize] (https://github.com/granth/titleize/blob/master/lib/titleize.rb). Potrebbe essere installato come gemma. – mudasobwa

risposta

0

Questo è piuttosto semplice, basta aggiungere una condizione quando si chiama captalize:

$nocaps = ['Jack', 'Jill'] 

def titleize(string) 
    string.split(" ").map {|word| word.capitalize unless $nocaps.include?(word)}.join(" ") 
end 

Le variabili globali sono artificiosa per questo esempio, sarebbe probabilmente una variabile di istanza nella vostra applicazione reale.

+0

'if not' dovrebbe essere' unless'. Ma questo rallenterà più a lungo l'elenco di 'nocaps' si ottiene perché' include? 'Deve percorrere l'array in sequenza. –

+0

@theTinMan Un buon punto, tendo a non usare 'unless', anche se, anche in questa situazione. A qualcuno a quanto pare non piace comunque questa soluzione; ma non hanno lasciato un commento. –

6

Probabilmente si desidera creare un'estensione della funzione existing titleize fornita da Rails.

Per fare ciò, basta includere il seguente file in un inizializzatore, e presto! Fornire le eccezioni al volo o, facoltativamente, modificare il mio esempio per aggiungere i valori predefiniti nell'inizializzatore.

Mi rendo conto che non si desidera utilizzare Regex, ma hey, la funzione di rotaie effettive utilizza Regex, quindi si potrebbe anche tenerlo sincronizzato.

Inserire questo file in Rails.root/lib/string_extension.rb e caricarlo in un inizializzatore; o semplicemente lanciarlo nell'inizializzatore stesso.

UPDATE: modificato il REGEX su questo grazie al suggerimento di @ svoop per aggiungere il confine della parola finale.

# encoding: utf-8 
class String 
    def titleize(options = {}) 
    exclusions = options[:exclude] 

    return ActiveSupport::Inflector.titleize(self) unless exclusions.present? 
    self.underscore.humanize.gsub(/\b(?<!['’`])(?!(#{exclusions.join('|')})\b)[a-z]/) { $&.capitalize } 
    end 
end 
3

Ecco il mio piccolo codice. Puoi rifrattarlo in poche righe.

def titleize(str) 
    str.capitalize! # capitalize the first word in case it is part of the no words array 
    words_no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 
    phrase = str.split(" ").map {|word| 
     if words_no_cap.include?(word) 
      word 
     else 
      word.capitalize 
     end 
    }.join(" ") # I replaced the "end" in "end.join(" ") with "}" because it wasn't working in Ruby 2.1.1 
    phrase # returns the phrase with all the excluded words 
end 
1

La risposta di @codenamev non è abbastanza fare il lavoro:

EXCLUSIONS = %w(a the and or to) 
"and the answer is all good".titleize(exclude: EXCLUSIONS) 
# => "And the Answer Is all Good" 
         ^^^ 

esclusioni devono corrispondere trailing confini di parola. Ecco una versione migliorata:

# encoding: utf-8 
class String 
    def titleize(options = {}) 
    exclusions = options[:exclude] 

    return ActiveSupport::Inflector.titleize(self) unless exclusions.present? 
    self.underscore.humanize.gsub(/\b(['’`]?(?!(#{exclusions.join('|')})\b)[a-z])/) { $&.capitalize } 
    end 
end 

"and the answer is all good".titleize(exclude: EXCLUSIONS) 
# => "And the Answer Is All Good" 
         ^^^ 
3

Se gettate questo in config/initializers in un nuovo file (si può chiamarlo qualcosa di simile string.rb), è possibile chiamare le funzioni personalizzate per qualsiasi stringa. Assicurati di riavviare, e poi sarai in grado di eseguire di seguito come ex) "anystring" .uncapitalize_puncs

Questo è più facile che cercare di modificare il codice predefinito di titleize. Quindi ora puoi chiamare @ something.title.titleize.uncapitalize_puncs

class String 

    def uncapitalize_puncs 
     puncs = ["and", "the", "to", "of", "by", "from", "or"] 
     array = self.split(" ") 
     array.map! do |x| 
      if puncs.include? x.downcase 
       x.downcase 
      else 
       x 
      end 
     end 
     return array.join(" ") 
    end 

end 
3

Se si desidera di non capitalizzare e o, semplicemente effettuare le seguenti operazioni:

def titleize(string) 
    nocaps = "and" 
    string.split(" ").map { |word| nocaps.include?(word) ? word : word.capitalize }.join(" ") 
end 
0

Alcuni titoli hanno casi limite (gioco di parole) che potrebbe essere necessario prendere in considerazione.

Ad esempio, le parole piccole all'inizio di un titolo o dopo la punteggiatura spesso devono essere in maiuscolo (ad esempio "Le cronache di Narnia: Il leone, la strega e l'armadio" che contiene entrambe).

Si potrebbe anche volere/dovere forzare parole minuscole in minuscole, in modo che l'input come "Jack e Jill" venga reso a "Jack and Jill".

A volte potrebbe essere necessario rilevare quando una parola (in genere i nomi di marca) deve conservare una maiuscola inusuale, ad es. "iPod" o acronimi, ad es. "NATO", o nomi di dominio, "esempio.com".

Per gestire correttamente questi casi, la gemma titleize è tua amica, o almeno dovrebbe fornire la base per una soluzione completa.

1

Metodo capitalizzare para títulos

def capitalizar_titulo(string) 
    words_not_to_capitalize = ["a","e","i","o","u","ao","aos", "as", "nos","nós","no","na","mas", "mes", "da", "de", "di", "do", "das", "dos"] 
    s = string.split.each{|str| str.capitalize! unless words_not_to_capitalize.include? (str.downcase) } 
    s[0].capitalize + " " + s[1..-1].join(" ") 
    end 
+1

Benvenuti in Stack Overflow! Puoi leggere come rispondere a una domanda. SO è un sito inglese. – Katie

0
titleize("the matrix or titanic") 

def titleize(string) 
    no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 
    string.split(" ").map { |word| no_cap.include?(word) ? word : 
    word.capitalize }.join(" ") 
end 

risultato:

"the Matrix or Titanic" 
Problemi correlati