0

我有以下函数,它接受文本和字数,如果文本中的字数超过字数,它会被省略号截断。

#Truncate the passed text. Used for headlines and such
  def snippet(thought, wordcount)
    thought.split[0..(wordcount-1)].join(" ") + (thought.split.size > wordcount ? "..." : "")
  end 

然而,这个函数没有考虑到非常长的单词,例如......

“你好哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

我想知道是否有更好的方法来处理我正在尝试做的事情,以便以有效的方式同时考虑字数和文本大小。

4

5 回答 5

4

这是一个 Rails 项目吗?

为什么不使用以下帮助程序:

truncate("Once upon a time in a world far far away", :length => 17)

如果没有,只需重用代码。

于 2012-06-27T20:47:57.210 回答
2

这可能是一个两步过程:

  1. 将字符串截断为最大长度(不需要正则表达式)
  2. 使用正则表达式,从截断的字符串中找到最大字数。

编辑:

另一种方法是将字符串拆分为单词,循环遍历数组,将长度相加。当你发现超限时,join 0 .. index就在超限之前。

于 2012-06-27T21:10:41.507 回答
1

提示:正则表达式^(\s*.+?\b){5}将匹配前 5 个“单词”

于 2012-06-27T20:42:09.033 回答
0

检查单词和字符限制的逻辑变得过于复杂,无法清晰地表达为一个表达式。我会建议这样的事情:

def snippet str, max_words, max_chars, omission='...'
  max_chars = 1+omision.size if max_chars <= omission.size # need at least one char plus ellipses
  words = str.split
  omit = words.size > max_words || str.length > max_chars ? omission : ''
  snip = words[0...max_words].join ' '
  snip = snip[0...(max_chars-3)] if snip.length > max_chars
  snip + omit
end

正如其他人指出的那样,Rails String#truncate 几乎提供了您想要的功能(截断以适应自然边界的长度),但它不允许您独立声明最大字符长度和字数。

于 2012-06-27T20:58:56.130 回答
0

前 20 个字符

>> "hello world this is the world".gsub(/.+/) { |m| m[0..20] + (m.size > 20 ? '...' : '') }
=> "hello world this is t..."

前5个字

>> "hello world this is the world".gsub(/.+/) { |m| m.split[0..5].join(' ') + (m.split.size > 5 ? '...' : '') }
=> "hello world this is the world..."
于 2017-02-17T23:09:58.833 回答