你如何在最近的空间截断一个句子?

时间:2012-11-28 12:01:03

标签: ruby

我们有一个句子和一个字符限制。如果句子超出了字符限制,我们想要截断它,但只是在一个空格处,而不是在一个单词的中间。

这是我们到目前为止所做的:

  def shortened_headline(max_length)
    return @headline unless @headline.length > max_length
    @headline[0..max_length]
  end

5 个答案:

答案 0 :(得分:3)

修剪标题后,您可以使用rindex查找数组或字符串右侧的索引。

类似的东西:

sub_length=@headline[0..max_length].rindex(' ')

将为您提供标题中最后一个空格的位置。如果你想在字符串中找到最后一个非字母数字字符,你也可以将它与正则表达式一起使用,这样你就可以打破最后一个空格或标点符号。

More on rindex here.

答案 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)/]