如何中心截断字符串?

chu*_*boy 15 ruby ruby-on-rails

有没有人有任何代码方便中心截断Ruby on Rails中的字符串?

这样的事情:例如:"Hello World,你好吗?" >>"你好吗?"

Ben*_*van 32

如果你想要一个固定的长度而不管字符串的长度,你可以使用Rails #truncate:

s.truncate(100, omission: "...#{s.last(50)}")
Run Code Online (Sandbox Code Playgroud)


Mik*_*use 13

一个正则表达式版本怎么样:

class String
  def ellipsisize
    gsub(/(...).{4,}(...)/, '\1...\2')
  end
end

"abc".ellipsisize #=> "abc"
"abcdefghi".ellipsisize #=> "abcdefghi"
"abcdefghij".ellipsisize #=> "abc...hij"
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中所建议的,参数化长度(并使用不同的正则表达式,只是为了它)

class String
  def ellipsisize(len = 9)
    len = 9 unless len > 9 # assumes minimum chars at each end = 3
    gsub(%r{(...).{#{len-5},}(...)}, '\1...\2')
  end
end
Run Code Online (Sandbox Code Playgroud)

所以...

"abcdefghij".ellipsisize #=> "abc...hij"
Run Code Online (Sandbox Code Playgroud)

但我们也可以:

"abcdefghij".ellipsisize(10) #=> "abcdefghij"
Run Code Online (Sandbox Code Playgroud)


khe*_*lll 12

这是Mike Woodhouse的答案的修改版本.它需要2个可选的参数:要被省略的字符串的最小长度和边长.

class String
  def ellipsisize(minimum_length=4,edge_length=3)
    return self if self.length < minimum_length or self.length <= edge_length*2 
    edge = '.'*edge_length    
    mid_length = self.length - edge_length*2
    gsub(/(#{edge}).{#{mid_length},}(#{edge})/, '\1...\2')
  end
end


"abc".ellipsisize #=> "abc"
"abcdefghi".ellipsisize #=> "abcdefghi"
"abcdefghij".ellipsisize #=> "abc...hij"
"abcdefghij".ellipsisize(4,4) #=> "abcd...ghij"
"Testing all paramas and checking them!".ellipsisize(6,5) #=> "Testi...them!"
Run Code Online (Sandbox Code Playgroud)

  • 呃,我改变了我的然后注意到你做了一个更完整的版本。好的。+1 (2认同)
  • 很复杂.使用现有的Rails`String`助手,查看我的答案,找到更简单的解决方案. (2认同)

Joã*_*lva 5

由于您没有指定要截断的字符数,因此我假设您(要从您的示例中)截断长度大于6的字符串.然后你可以使用这样的东西:

s = "Hello World, how are you?"
s = s[0, 3] + "..." + s[-3, 3] if s.length > 9
=> "Hel...ou?"
Run Code Online (Sandbox Code Playgroud)

如果您需要截断更多字符,只需调整范围即可.


Dig*_*oss 5

这是我的建议:

s[3...-4] = "..." if s.length > 9
Run Code Online (Sandbox Code Playgroud)

  • 我真的不喜欢就地编辑,因为你不知道字符串来自哪里。如果它是一个模型属性并且您稍后调用 save 怎么办? (2认同)
  • 是的,`(s=s.dup)[3...-4] = ...` 可能会更好,甚至可以在“作为黑匣子”的观点中发挥作用。好点子。 (2认同)