我们有一个句子和一个字符限制。如果句子超出了字符限制,我们想要截断它,但只是在一个空格处,而不是在一个单词的中间。
这是我们到目前为止所做的:
def shortened_headline(max_length)
return @headline unless @headline.length > max_length
@headline[0..max_length]
end
答案 0 :(得分:3)
修剪标题后,您可以使用rindex
查找数组或字符串右侧的索引。
类似的东西:
sub_length=@headline[0..max_length].rindex(' ')
将为您提供标题中最后一个空格的位置。如果你想在字符串中找到最后一个非字母数字字符,你也可以将它与正则表达式一起使用,这样你就可以打破最后一个空格或标点符号。
答案 1 :(得分:3)
Rails使用各种便捷方法扩展String
类,其中包括truncate
方法,您可以传递:separator
选项。即使您不使用Rails,也可以简单地复制它们的实现。请参阅
http://api.rubyonrails.org/classes/String.html#method-i-truncate
(您可以点击“显示来源”查看实际的实施情况)
答案 2 :(得分:2)
您应该使用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"
答案 3 :(得分:2)
看一下ActiveSupport的Strings核心扩展,特别是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 page有更多信息。
答案 4 :(得分:0)
@headline[/.{,#{max_length}}(?: |\z)/]