在rails中的单词中间截断一个没有剪切的字符串

Seb*_*ien 21 truncate ruby-on-rails ruby-on-rails-3

如何将文本截断到最靠近轨道3的位置,而不是在单词的中间切割?

例如,我有字符串:

"Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."
Run Code Online (Sandbox Code Playgroud)

如果我切它,我想像这样切:

"Praesent commodo cursus magna, vel scelerisque nisl ..."
Run Code Online (Sandbox Code Playgroud)

并不是 :

"Praesent commodo cursus magna, vel scelerisque nisl conse..."
Run Code Online (Sandbox Code Playgroud)

Suh*_*tel 45

如果将分隔符传递给truncate方法,它将执行自然的单词分隔,而不是截断单词的中间位置

这样的东西应该工作(如果你想要30个字符的默认值,可以将长度改为你要删除它的任何长度):

truncate("Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.", :length => 17, :separator => ' ')
Run Code Online (Sandbox Code Playgroud)

有关截断中可以使用的选项的更多信息,请参阅文档


Nic*_*now 6

截断是一个很好的选择,但如果你想要完整的单词检测,正则表达式是你的解决方案.我会推荐这样的东西:

string.match(/^.{0,30}\b/)[0]
Run Code Online (Sandbox Code Playgroud)

或者你可以把它放在一个函数中

def shorten(string, count)
  string.match(/^.{0,#{count}}\b/)[0]
end
Run Code Online (Sandbox Code Playgroud)

更新

根据Rails文档,您可以将正则表达式传递给truncate方法,如下所示:

'Once upon a time in a world far far away'.truncate(27, separator: /\s/)
Run Code Online (Sandbox Code Playgroud)

这两个选项都提供了比将空格字符传入truncate方法更好的字边界检测.


Oss*_*Oss 6

开始Rails 4.2有一个ActiveSupport叫做的新方法string#truncate_words.它按字数截断字符串,这使得无法在单词的中间进行剪切.

'And they found that many people were sleeping better.'.truncate_words(5, omission: '... (continued)')
Run Code Online (Sandbox Code Playgroud)

返回

"And they found that many... (continued)"
Run Code Online (Sandbox Code Playgroud)