Html 在不截断的情况下显示特定长度的字符串
我正在用ruby显示一个特定长度的字符串。一行中只能显示该字符串的80个字符。例如,如果字符串长度为82,那么它将显示在2行中,如果长度为250,那么字符串将显示在5行中,等等,我想在空格上拆分,而不是在单词上拆分Html 在不截断的情况下显示特定长度的字符串,html,ruby,string,slice,Html,Ruby,String,Slice,我正在用ruby显示一个特定长度的字符串。一行中只能显示该字符串的80个字符。例如,如果字符串长度为82,那么它将显示在2行中,如果长度为250,那么字符串将显示在5行中,等等,我想在空格上拆分,而不是在单词上拆分 我是这方面的新手,所以不知道如何解决这个问题。一个非常快速且肮脏的迭代版本: max_chars = 80 text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
我是这方面的新手,所以不知道如何解决这个问题。一个非常快速且肮脏的迭代版本:
max_chars = 80
text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'
lines = []
words = text.split
while words.length > 0
line = words.shift
while words.first && (line.length + words.first.length + 1) <= max_chars
line << " #{words.shift}"
end
lines << line
end
lines.each { |line| puts line }
#=> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
# tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
# vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
# no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
# amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
# labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam
# et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
# sanctus est Lorem ipsum dolor sit amet.
max_chars=80
text=‘Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidunt ut labour and dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯泰特·克莱塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区是属于同一领域的。他说:“我的工作是在工作中完成的,我的工作是在工作中完成的,我的工作是在工作中完成的。”。在vero eos和accusam以及justo duo dolores和ea Reum。斯泰特·克利塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区是属于同一领域的
行=[]
words=text.split
而words.length>0
line=words.shift
而words.first&(line.length+words.first.length+1)只是出于好奇:
loop.inject([[], input]) do |(acc, src)|
if m = src[/.{1,79}(\s|\z)/]
[acc << m, $']
else
break acc << src
end
end
loop.inject([],input])do |(acc,src)|
如果m=src[/.{1,79}(\s |\z)/]
[acc
请参阅。正则表达式的内容为:“匹配1
和max_line_len
字符,前面紧跟字符串或空格的开头,后面紧跟空格或字符串的结尾”。(?其他选项,不太干净,但
其思想是找到空格的索引,并用\n
替换索引中接近行长度的空格
因此,给定字符串str
和max_len
:
delta = 0
(str + " ")
.each_char.with_index.with_object([]) { |(c, i), o| o << i if c == " "} # find the index of the spaces
.each_cons(2).with_object([]) do |(a, b), tmp| # select the index to be substituted
if b > (tmp.size + 1) * max_len + delta
tmp << a
delta = tmp.last - max_len * tmp.size + 1
end
end.each { |i| str[i] = "\n" } # substitute
delta=0
(str+“”)
.每个带有索引的字符,带有对象([]){|(c,i),o | o(tmp.size+1)*max_len+delta
tmp如果n=str.size
是字符串的长度,计算m,r=n.divmod(80)
,然后m.times{i | put str[80*i,80]};put str[-r..-1]如果R>0 < /代码>。请参见。和。您是否要拆分字符串?例如,只在空白处。或者,可以在中间的某个地方拆分单词吗?不,我想只在空白处拆分单词。您应该编辑您的问题,将上面的注释中的信息结合起来。为什么几乎没有人选择<代码>循环。s而
这要求在外部范围中声明局部变量:)+1用于循环
返回枚举数。我以前没有见过。作为一个枚举数狂热者,我已经把它藏起来了。这不应该是打破acc
吗?为什么79
而不是80
?@CarySwoveland 79因为包含了尾随空格。打破acc
似乎是合法的。扫描在任何情况下都会更好:)清洁简洁且完美。即使我对正则表达式是个笨蛋!:)
str = "Little Miss Muffet she sat on her tuffet, eating her curds and whey. Along " +
"came a spider who sat down beside her and frightened Miss Muffet away."
1 2 3
123456789012345678901234567890123
puts wrap(str, 31)
Little Miss Muffet she sat on
her tuffet, eating her curds
and whey. Along came a spider
who sat down beside her and
frightened Miss Muffet away.
puts wrap(str, 32)
Little Miss Muffet she sat on
her tuffet, eating her curds and
whey. Along came a spider who
sat down beside her and
frightened Miss Muffet away.
puts wrap(str, 33)
Little Miss Muffet she sat on her
tuffet, eating her curds and
whey. Along came a spider who sat
down beside her and frightened
Miss Muffet away.
delta = 0
(str + " ")
.each_char.with_index.with_object([]) { |(c, i), o| o << i if c == " "} # find the index of the spaces
.each_cons(2).with_object([]) do |(a, b), tmp| # select the index to be substituted
if b > (tmp.size + 1) * max_len + delta
tmp << a
delta = tmp.last - max_len * tmp.size + 1
end
end.each { |i| str[i] = "\n" } # substitute