Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在不截断的情况下显示特定长度的字符串_Html_Ruby_String_Slice - Fatal编程技术网

Html 在不截断的情况下显示特定长度的字符串

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

我正在用ruby显示一个特定长度的字符串。一行中只能显示该字符串的80个字符。例如,如果字符串长度为82,那么它将显示在2行中,如果长度为250,那么字符串将显示在5行中,等等,我想在空格上拆分,而不是在单词上拆分


我是这方面的新手,所以不知道如何解决这个问题。

一个非常快速且肮脏的迭代版本:

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