我们有一个句子和一个字符限制。如果句子超过字符限制,我们想截断它,但只在空格处,而不是在单词中间。
这是我们目前所拥有的:
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
修剪标题后,您可以使用rindex
从数组或字符串的右侧查找某些内容的索引。
就像是:
sub_length=@headline[0..max_length].rindex(' ')
将为您提供标题中最后一个空格的位置。如果您想在字符串中找到最后一个非字母数字字符,也可以将它与正则表达式一起使用,这样您就可以在最后一个空格或标点符号处打断。
Rails 用各种方便的方法扩展了这个String
类,其中一个truncate
方法可以传递一个:separator
选项。即使您不使用 Rails,您也可以简单地复制它们的实现。请参阅文档
http://api.rubyonrails.org/classes/String.html#method-i-truncate
(可以点击“show source”查看实际实现)
您应该使用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 不久前被重构,允许我们挑选我们想要的功能,而无需拉入完整的库。它充满了善良。核心扩展页面有更多信息。
@headline[/.{,#{max_length}}(?: |\z)/]