文と文字数制限があります。文が文字数制限を超えている場合は文を切り詰めたいと考えていますが、単語の途中ではなく、スペースでのみ切り捨てます。
これは私たちがこれまでに持っているものです:
def shortened_headline(max_length)
return @headline unless @headline.length > max_length
@headline[0..max_length]
end
文と文字数制限があります。文が文字数制限を超えている場合は文を切り詰めたいと考えていますが、単語の途中ではなく、スペースでのみ切り捨てます。
これは私たちがこれまでに持っているものです:
def shortened_headline(max_length)
return @headline unless @headline.length > max_length
@headline[0..max_length]
end
Railsは、オプションを渡すことができるString
メソッドなど、さまざまな便利なメソッドでクラスを拡張します。Railsを使用しない場合でも、Railsの実装をコピーするだけで済みます。のドキュメントを参照してくださいtruncate
:separator
http://api.rubyonrails.org/classes/String.html#method-i-truncate
(「ソースの表示」をクリックして、実際の実装を確認できます)
rindex
配列または文字列の右側から何かのインデックスを見つけるために使用できる見出しをトリミングしました。
何かのようなもの:
sub_length=@headline[0..max_length].rindex(' ')
見出しの最後のスペースの位置を示します。文字列内の英数字以外の最後の文字を見つけて、最後のスペースまたは句読点で改行できるようにする場合は、正規表現で使用することもできます。
String#indexを使用する必要があります。文字列が最初に出現するインデックスを見つけ、それを受け入れてオフセットします。
注:この実装では、max_length の後の最初のスペースで文字列が切り取られます(これは、あなたが望むものではないかもしれません)。max_length の前に最初のスペースをカットする必要がある場合は、@glenatron の回答を参照してください。
def shortened_headline(headline, max_length)
return headline if headline.length < max_length
space_pos = headline.index(' ', max_length)
headline[0..space_pos-1]
end
h = 'How do you truncate a sentence at the nearest space?'
h[0..4] # => "How d"
shortened_headline(h, 5) # => "How do"
h[0..10] # => "How do you "
shortened_headline(h, 10) # => "How do you"
h[0..15] # => "How do you trunc"
shortened_headline(h, 15) # => "How do you truncate"
ActiveSupport の文字列用のコア拡張機能、特にtruncate
メソッドを見てください。
ドキュメントから:
The method truncate returns a copy of its receiver truncated after a given length:
"Oh dear! Oh dear! I shall be late!".truncate(20)
# => "Oh dear! Oh dear!..."
次のようにアクセスします。
irb(main):001:0> require 'active_support/core_ext/string/filters'
irb(main):002:0> 'how now brown cow'.truncate(10)
=> "how now..."
このtruncate
メソッドには、余分な装飾が必要ない場合に省略記号をオフにする機能があります。
ActiveSupport は少し前にリファクタリングされ、完全なライブラリを取り込まなくても必要な機能を選択できるようになりました。良さがぎっしり詰まっています。core-extension ページには、さらに多くの情報があります。
@headline[/.{,#{max_length}}(?: |\z)/]