用Rails截断字符串?

kru*_*hah 54 ruby truncate ruby-on-rails

我想截断一个字符串如下:

输入:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
Run Code Online (Sandbox Code Playgroud)

输出:

string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
Run Code Online (Sandbox Code Playgroud)

Veg*_*ger 93

看看truncate,它部分想要你想要的.如果你测试它是否被截断,你可以在截断的部分之后添加一些最后一部分.

truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."

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

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

truncate("And they found that many people were sleeping better.", :length => 25, :omission => '... (continued)')
# => "And they f... (continued)"
Run Code Online (Sandbox Code Playgroud)

  • 无效方法截断 (2认同)
  • `include ActionView::Helpers::TextHelper` 如果不在视图内。 (2认同)

fl0*_*00r 14

在最简单的情况下:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
tr_string = string[0, 20] + "..." + string[-5,5]
Run Code Online (Sandbox Code Playgroud)

要么

def trancate(string, length = 20)
  string.size > length+5 ? [string[0,length],string[-5,5]].join("...") : string
end

# Usage
trancate "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
#=> "abcd asfsa sadfsaf s...ddddd"
trancate "Hello Beautiful World"
#=> "Hello Beautiful World"
trancate "Hello Beautiful World", 5
#=> "Hello...World"
Run Code Online (Sandbox Code Playgroud)

  • 看起来像rails [cares](https://github.com/lifo/docrails/blob/master/activesupport/lib/active_support/core_ext/string/filters.rb#L42) (2认同)

yeg*_*256 13

没有Rails 你几乎可以做同样的事情:

text.gsub(/^(.{50,}?).*$/m,'\1...')
Run Code Online (Sandbox Code Playgroud)

50 是你需要的长度.


Jos*_*ter 10

截断自定义省略

与其他人在此处提出的建议类似,您可以使用Rails的#truncate方法并使用实际上是字符串最后一部分的自定义省略:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
Run Code Online (Sandbox Code Playgroud)

正是你想要的.

奖励积分

你可能希望将它包装在一个自定义方法中,这个方法就像truncate_middle为你做一些花哨的步法:

# Truncate the given string but show the last five characters at the end.
#
def truncate_middle( string, options = {} )
  options[:omission] = "...#{string[-5, 5]}"    # Use last 5 chars of string.

  truncate( string, options )
end
Run Code Online (Sandbox Code Playgroud)

然后就这样称呼它:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"

truncate_middle( string, length: 37 )
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
Run Code Online (Sandbox Code Playgroud)

繁荣!

谢谢你提出这个问题.我认为这是显示较长文本片段的有用方法.


ell*_*i0t 9

这可能不是您问题的确切解决方案,但我认为这将有助于您以正确的方式处理正确的方向.

如果你想要"Hello,World!" 要限制在前五个字母,你可以这样做:

str = "Hello, World!"
str[0...5] # => "Hello"
Run Code Online (Sandbox Code Playgroud)

如果你想要一个省略号,只需插入它:

"#{str[0...5]}..." #=> "Hello..."
Run Code Online (Sandbox Code Playgroud)

  • 如果`str`碰巧少于6个字符,那么省略号仍然会被添加到最后 - 如果是"#{str [0..5]}#{'...',可能会更好str.length> 6}"` (3认同)

hiv*_*eer 5

这是源代码 String#truncate

def truncate(truncate_at, options = {})
  return dup unless length > truncate_at

  options[:omission] ||= '...'
  length_with_room_for_omission = truncate_at - options[:omission].length
  stop = \
    if options[:separator]
      rindex(options[:separator], length_with_room_for_omission) ||      length_with_room_for_omission
    else
      length_with_room_for_omission
    end

   "#{self[0...stop]}#{options[:omission]}"
end
Run Code Online (Sandbox Code Playgroud)

所以,至于你的情况

string.truncate(37, :omission => "...ddddd")
Run Code Online (Sandbox Code Playgroud)