11
def titleize(string)
  string.split(" ").map {|word| word.capitalize}.join(" ")
end

これはすべての単語にタイトルを付けますが、大文字にしたくない特定の単語をキャプチャするにはどうすればよいですか?

ie) ジャックとジル

また、正規表現は使用しないでください。

アップデート:

このコードを機能させるのに問題があります。単語の配列をすべて大文字で出力するようにしましたが、以下のリストがないわけではありません。

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
4

10 に答える 10

9

おそらく、Rails が提供する既存のtitleize関数の拡張機能を作成したいと思うでしょう。

これを行うには、次のファイルをイニシャライザに含めるだけです。その場で例外を提供するか、オプションで私の例を変更して、初期化子にデフォルトを追加します。

Regex を使いたくないのはわかりますが、実際の Rails 関数は Regex を使用しているので、同期を維持した方がよいでしょう。

このファイルを入れてRails.root/lib/string_extension.rb、初期化子にロードします。または、イニシャライザ自体にスローします。

更新: 末尾の単語境界を追加するための @svoop の提案のおかげで、これに関する REGEX を変更しました。

# 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
于 2013-07-25T13:44:22.410 に答える
3

これが私の小さなコードです。それを数行に屈折させることができます。

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
于 2013-10-29T06:08:31.847 に答える
3

and または the を大文字にしたくない場合は、次のようにします。

def titleize(string)
  nocaps = "and"
  string.split(" ").map { |word| nocaps.include?(word) ? word : word.capitalize }.join(" ")
end
于 2015-01-06T05:28:08.920 に答える
3

これを config/initializers の新しいファイル (string.rb のような名前にすることができます) に入れると、カスタム関数を任意の文字列に対して呼び出すことができます。必ず再起動すると、ex) "anystring".uncapitalize_puncs のように以下を実行できるようになります。

これは、titleize のデフォルト コードを変更しようとするよりも簡単です。これで、@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
于 2014-07-20T05:43:12.807 に答える
2

メトド大文字化パラタイトル

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
于 2016-12-05T12:29:31.777 に答える
2

@codenamevの答えは、うまく機能していません。

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

除外は、末尾の単語の境界と一致する必要があります。改善されたバージョンは次のとおりです。

# 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"
                        ^^^
于 2013-12-27T10:50:59.673 に答える
0

一部のタイトルには、考慮が必要なエッジ ケース (しゃれが意図されています) があります。

たとえば、タイトルの最初または句読点の後の小さな単語は、多くの場合、大文字にする必要があります (例: 「ナルニア国物語: ライオン、魔女、ワードローブ」には両方があります)。

また、「Jack And Jill」のような入力が「Jack and Jill」にレンダリングされるように、小さな単語を強制的に小文字にする必要がある場合もあります。

場合によっては、単語 (通常はブランド名) が、"iPod" などの通常とは異なる大文字、"NATO" などの頭字語、またはドメイン名 ("example.com") を保持する必要がある場合も検出する必要がある場合があります。

このようなケースを適切に処理するには、titleize gem が役に立ちます。または、少なくとも完全なソリューションの基礎を提供する必要があります。

于 2016-10-11T00:37:34.243 に答える
0

これは非常に簡単です。呼び出すときに条件を追加するだけですcaptalize

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

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

グローバル変数はこの例のために工夫されたもので、おそらく実際のアプリケーションではインスタンス変数になります。

于 2013-02-26T00:09:12.947 に答える