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