Ruby on rails 用轨道截断字符串?
我要按如下方式截断字符串: 输入:Ruby on rails 用轨道截断字符串?,ruby-on-rails,ruby,truncate,Ruby On Rails,Ruby,Truncate,我要按如下方式截断字符串: 输入: string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" string = "abcd asfsa sadfsaf safsdaf aa...ddddd" 输出: string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" string = "abcd asfsa sadfs
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
输出:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
看一看,它确实有一部分是你想要的。如果您测试它是否有分叉,您可以将最后的部分添加回截断部分之后
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]
或
这实际上是一个有趣的问题,您可能希望使用javascript而不是ruby来解决它。这就是为什么,您可能在屏幕上的某个地方显示此文本,并且您只有一定的可用宽度。因此,与其将链接(或任何文本)缩减为若干个字符,您真正想要的是确保显示的文本永远不会超过某个宽度。一个特定宽度可以容纳多少字符取决于您使用的字体、间距等(css样式)。如果您使用的是基于ruby的解决方案,那么您可以确保一切正常,但是如果您决定稍后更改样式,那么一切都可能会突然发生 因此,我推荐一种基于javascript的解决方案。我以前处理它的方式是使用。在应用程序中包含插件。然后在每次加载页面时挂接一些类似于以下内容的javascript:
function truncateLongText() {
$('.my_style1').truncate({
width: 270,
addtitle: true
});
$('.my_style2').truncate({
width: 100
});
}
添加任何其他需要截断的样式以及它们应该遵守的宽度,插件完成其余的工作。这样做的另一个好处是,可以方便地将整个应用程序的所有截断逻辑放在一个地方。没有Rails,您也可以这样做:
text.gsub(/^(.{50,}?).*$/m,'\1...')
50
是您需要的长度。这是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")
这可能不是你问题的确切解决方案,但我认为它将帮助你走上正确的方向,以一种非常干净的方式做事 如果希望“Hello,World!”仅限于前五个字母,可以执行以下操作:
str = "Hello, World!"
str[0...5] # => "Hello"
如果需要椭圆,只需对其进行插值:
"#{str[0...5]}..." #=> "Hello..."
带自定义省略的截断
与其他人在这里建议的类似,您可以使用Rails的方法并使用一个自定义省略,它实际上是字符串的最后一部分:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
正是你想要的
加分
您可能希望使用一个名为truncate\u 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"
轰
谢谢你问这个问题。我认为这是一种显示较长文本片段的有用方法。对于只使用
RUBY
而不使用Rails
的人来说
这是一个受@yegor256的启发而设计的解决方案
使用like-so:
truncate("your very very very long message", :length => 10)
您还可以使用省略
选项提供替换文本:
truncate("your very very very long message", :length => 10, :omission => '... more')
你的意思是在大约10个字符后简单地将其截断吗?
trancate“Hello”,5
将返回Hello…Hello
。编辑:抱歉,错过了字符串。size
不是string.size>=长度+8吗?如果你有25个字符长的字符串,你将得到28个字符长的字符串。@Serabe,如果你有26个字符长的字符串,你将得到28个字符。但没人在乎。2.X不支持:separator
参数,这与长度无关,而是与TranCatingSeem(如rails)有关。无效方法截断包括ActionView::Helpers::TextHelper
,如果不是内部视图。我同意,这肯定是客户端的事情(在大多数情况下,与MySQL索引注释不同)。但是,当客户端不是HTML5,而是ObjC或Java时会发生什么呢?如果str
恰好少于6个字符,省略号仍将添加到末尾-如果您在控制器中并且需要从文本转换为字符串,则最好执行类似“#{str[0..5]}#{If str length>6}”的操作,这很方便。