1

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

这是我们目前所拥有的:

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

5 回答 5

3

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

就像是:

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

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

更多关于 rindex 的信息。

于 2012-11-28T12:05:53.617 回答
3

Rails 用各种方便的方法扩展了这个String类,其中一个truncate方法可以传递一个:separator选项。即使您不使用 Rails,您也可以简单地复制它们的实现。请参阅文档

http://api.rubyonrails.org/classes/String.html#method-i-truncate

(可以点击“show source”查看实际实现)

于 2012-11-28T12:10:46.430 回答
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"
于 2012-11-28T12:06:26.657 回答
2

看看 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 不久前被重构,允许我们挑选我们想要的功能,而无需拉入完整的库。它充满了善良。核心扩展页面有更多信息。

于 2012-11-28T16:30:30.493 回答
0
@headline[/.{,#{max_length}}(?: |\z)/]
于 2012-11-28T13:02:33.863 回答