用Rails截断string?

我想截断一个string,如下所示:

input:

string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" 

输出:

 string = "abcd asfsa sadfsaf safsdaf aa...ddddd" 

看看截断 ,它部分确实想要你想要的。 如果你testing是否得到了trunctated,你可以在截断的部分之后添加一些最后的部分。

 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)" 

在最简单的情况下:

 string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" tr_string = string[0, 20] + "..." + string[-5,5] 

要么

 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" 

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

 text.gsub(/^(.{50,}?).*$/m,'\1...') 

50是你需要的长度。

这可能不是您的问题的确切解决scheme,但我认为这将有助于您朝正确的方向发展,并采取相当干净的做事方式。

如果你想“你好,世界!” 限于前五个字母,你可以这样做:

 str = "Hello, World!" str[0...5] # => "Hello" 

如果你想要一个椭圆,就插入它:

 "#{str[0...5]}..." #=> "Hello..." 

截断与自定义省略

类似于其他人在这里所build议的,您可以使用Rails的#truncate方法,并使用实际上是string最后部分的自定义省略:

 string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate(string, length: 37, omission: "...#{string[-5, 5]}") # => "abcd asfsa sadfsaf safsdaf aa...ddddd" 

正是你想要的。

奖励积分

你可能想把它包装在一个名为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 

然后就这样调用它:

 string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate_middle( string, length: 37 ) # => "abcd asfsa sadfsaf safsdaf aa...ddddd" 

繁荣!

感谢您询问这个问题。 我认为这是一个有用的方式来显示一段较长的文本片段。

这是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 

所以,至于你的情况

 string.truncate(37, :omission => "...ddddd") 

这实际上是一个有趣的问题,你可能想要解决它使用JavaScript而不是ruby。 这是为什么,你可能在屏幕上显示这个文本,你只有一定的宽度可用。 所以不要让你的链接(或者任何文本)被裁减成多个字符,你真正想要的是确保你所显示的文本永远不会超过一定的宽度。 有多less个字符可以放在一定的宽度上,取决于你使用的字体,间距等(CSS样式)。 如果您使用的是基于ruby的解决scheme,那么您可以确保一切正常,但如果您稍后决定更改样式,则可能会全部崩溃。

所以,我推荐一个基于JavaScript的解决scheme。 我以前处理过的方法是使用jquery truncate插件 。 将该插件包含在您的应用程序中。 然后在每次加载页面时钩入一些类似于下面的javascript:

 function truncateLongText() { $('.my_style1').truncate({ width: 270, addtitle: true }); $('.my_style2').truncate({ width: 100 }); } 

添加任何其他样式需要被截断和他们应该尊重的宽度,插件做剩下的。 这有一个额外的好处,所有你的截断逻辑整个应用程序在一个地方可以很方便。