让string_a = "I'm a very long long long string"
Ruby 中是否有一种方法可以截断这样的字符串?:
magic_method(string_a) # => "I'm a ver...ng string"
在 Rails 中我可以做到:truncate(string_a)
但只返回第一部分。
让string_a = "I'm a very long long long string"
Ruby 中是否有一种方法可以截断这样的字符串?:
magic_method(string_a) # => "I'm a ver...ng string"
在 Rails 中我可以做到:truncate(string_a)
但只返回第一部分。
为什么不尝试类似的东西:
s[0..l] + "..." + s[s.length-l..s.length]
l * 2 + 3 是所需的长度,所以可能是这样的方法
def middle_truncate(s,length=20,ellipsis="...")
return s if s.length <= length + ellipsis.length
return s[0..length] if length < ellipsis.length
len = (length - ellipsis.length)/2
s_len = len - length % 2
s[0..s_len] + ellipsis + s[s.length-len..s.length]
end
s ="I'm a very long long long string"
puts middle_truncate(s, 100)
puts middle_truncate(s, 21)
puts middle_truncate(s, 11)
puts middle_truncate(s, 5)
puts middle_truncate(s*2, 45)
puts middle_truncate(s)
puts middle_truncate(s,2)
输出
I'm a very long long long string
I'm a ver...ng string
I'm ...ring
I...g
I'm a very long long ...long long long string
I'm a ver...g string
I'm
您可以尝试String.scan
使用正则表达式的方法来在您希望的位置断开字符串。尝试类似的东西:
def magic_method(string_x)
splits = string_x.scan(/(.{0,9})(.*?)(.{0,9}$)/)[0]
splits[1] = "..." if splits[1].length > 3
splits.join
end
解释:假设string_a = "I'm a very long long long string"
;string_b = "A small test string"
; 和string_c = "tiny"
。首先将字符串分成 3 组。
(.{0,9})
尝试捕捉前 9 个或更少的字符。前任。"I'm a ver"
对于string_a
; "A small t"
为string_b
和"tiny"
为string_c
。(.{0,9}$)
尝试捕获最后 9 个或更少的字符和字符串 ( $
) 的结尾。前任。"ng string"
对于string_a
; "st string"
对于string_b
和""
对于string_c
;(.*?)
试图抓住剩下的东西。这只起作用,因为?
这使得这个正则表达式不贪婪(否则它会得到字符串的其余部分,不给最后一组留下任何东西。例如:"y long long lo"
for string_a
,"e"
forstring_b
和""
forstring_c
然后我们检查中间组是否大于 3 个字符,如果是,我们替换为"..."
. 这只会发生在string_a
. 在这里,我们不想做string_b
更长的时间,用"e"
结果"..."
代替"A simple t...st string"
。
最后将组(数组元素)连接成一个字符串Array.join
str = "abcdefghijklmnopqrstuvwxyz"
str[9..-10] = "..."
p str #=> "abcdefghi...rstuvwxyz"
这可以解决问题:
ELLIPSIS = "..."
DEFAULT_MAX_LEN = 15
def trunc_to_len(string, len = DEFAULT_MAX_LEN)
return "" if len <= 0
return "." * len if len < ELLIPSIS.length + 2
return string if string.length <= len
# make room for "..."
half = (len - ELLIPSIS.length) / 2
string[0,half] + ELLIPSIS + string[-half,half]
end
这些例子:
puts trunc_to_len("I'm a very long long long string", 100)
puts trunc_to_len("I'm a very long long long string", 21)
puts trunc_to_len("I'm a very long long long string", 11)
puts trunc_to_len("I'm a very long long long string", 5)
puts trunc_to_len("I'm a very long long long string")
puts trunc_to_len("I'm a very long long long string",2)
输出:
I'm a very long long long string
I'm a ver...ng string
I'm ...ring
I...g
I'm a ...string
..
def trunc_to_len(s, n)
if n < s.length
i, j = n.divmod 2
s[0..i+j-1] + "..." + s[-i..-1]
else
s
end
end