Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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
Javascript 限制每行和换行的字符数,同时保留前导空格_Javascript_Substring_Word Wrap - Fatal编程技术网

Javascript 限制每行和换行的字符数,同时保留前导空格

Javascript 限制每行和换行的字符数,同时保留前导空格,javascript,substring,word-wrap,Javascript,Substring,Word Wrap,我的目标是: 选择一块文本(在本例中,仅选择一个字符串) 限制每行的字符数 为每行保留前导空格,并在文本换行后重新应用它 我能够正确地限制每行的字符数,但是我在空白处遇到了问题,等等 任何帮助都将不胜感激 一般逻辑 您的字符串已包含所有空格。如果将console.log(newStr)添加到脚本中并查看控制台,您将看到空白已经存在 您可能希望删除所有尾随空格(新行字符开始前的空格)。您可以通过使用regex替换来实现这一点:var newStr=addNewlines(str).toStr

我的目标是:

  • 选择一块文本(在本例中,仅选择一个字符串)
  • 限制每行的字符数
  • 为每行保留前导空格,并在文本换行后重新应用它
我能够正确地限制每行的字符数,但是我在空白处遇到了问题,等等

任何帮助都将不胜感激


一般逻辑

您的字符串已包含所有空格。如果将console.log(newStr)添加到脚本中并查看控制台,您将看到空白已经存在

您可能希望删除所有尾随空格(新行字符开始前的空格)。您可以通过使用regex替换来实现这一点:
var newStr=addNewlines(str).toString().replace(/\s+(?=\n)/g,”

此外,由于所有制表符(“\t”)将被识别为仅1个字符,但比其他字符占用更多的空间,因此您可能希望将其替换为3或4个空格。类似于
.replace(/\t/g,“”)

另一件需要考虑的事情是之前已经出现的新行。您需要停止在那里计数,并在已经存在的换行符之后启动一个新计数器

在文本区域内显示

var str=`我是一个有新行和空格的字符串。我需要保留前导空格,并在n个字符后将其重新添加到字符串中。
此行有前导空格。TTTTTTRRRR
TTGVGGGJJ。Gyjfry bh JKFRTUJ hhdt iihdrtttg。
这是另一句话。Hjkkl gggdetu jcfgjbfftt。
此行没有前导空格,因此我不需要重新应用任何空格。JJXSRG bjlkdetyhk llhfftt`;
函数addNewlines(str){
var结果=“”;
str=str.replace(/\t/g,“”);
而(str.length>0){
nPos=str.indexOf(“\n”);
len=nPos>0&&nPos<25?nPos+1:25;
结果+=str.substring(0,len)+'\n';
str=str.substring(len);
} 
返回结果;
}
var newStr=addNewlines(str).toString().replace(/\s+(?=\n)/g,“”;
document.getElementById(“结果”).value=newStr

有时在处理新算法时,使用两个或多个过程要容易得多。所以你认为它是如何一步一步地工作的,而不是一次完成所有的事情

我有一个有两个过程的实现:第一个过程是连接段落行,第二个过程是执行实际的拆分

我相信有更好的方法,但这是有效的,并得到了充分的评论

我不确定你的ES版本,所以我让它与ES5兼容

//将字符串分成特定大小的块
功能块(str,size){
var chunks=[];
while(str){
push(str.substring(0,size));
str=str.substring(大小);
}
返回块;
}
//删除字符串左侧的所有空格
功能左(str){
而(str.substr(0,1)==“”){
str=str.substr(1);
}
返回str;
}
//重复一个字符n次
功能重复(c,n){
返回数组(n+1).join(c);
}
函数addNewlines(str){
var MAX_COLS=25;//文本上的最大列数
var DEFAULT_LEADING=3;//导致重新应用的默认值
var MIN_LEADING=1;//段落中要考虑的最小间距量
var CR=“\n”;
var结果=“”;
var前导=0;
var chunks=[];
var formattedLines=[];//存储中间行
var startReadingSpaceLine=-1;//段落从哪里开始
变量i,l;//计数器
var lines=str.split(CR);//输入行
//在第一步中,我们加入段落行
对于(i=0;i-1){
//如果我们已经在一个段落上,
//我们不会覆盖国旗
}否则{
//但如果这是一段的第一行,
//我们设置了一个标志,允许将这条线与下一条线连接起来
//如果它也包含标识
startedingspaceline=i;
}
//如果我们在一个段落上,我们不会将这一行添加到数组中,
//首先,我们需要等待,看看段落中是否有更多的行
//我们还使用删除的空格更新数组中的行
直线[i]=l;
继续;
}否则{
//若行中并没有空格,我们将检查是否刚刚完成
//段落
如果(StartReadingSpaceLine>-1){
//如果我们这样做,那么我们需要将前面的行添加到数组中
//注意:如果我们想在行之间留一个空间,我们需要使用
//连接(“”)而不是连接(“”)
var paragraphLines=lines.slice(startedingspaceline,i).join(“”);
//我们添加我们喜欢的空白
段落行=重复(“”,默认_前导)+段落行;
格式化行。推送(段落行);
}
}
格式化行。推送(l);
}
//现在我们再次解析这些行,这次我们将进行分割
//把线分成几段
对于(i=0;ivar str = `i am a string that has new lines and whitespace. I need to preserve the leading whitespace and add it back on after the string has been broken up after n characters.

     This line has leading whitespace. Tttttt rrrrrr  
     ttgvgggjjj. Gyjfry bh jkkfrtuj hhdt iihdrtttg.
     Here is another line. Hjkkl gggdetu jcfgjbfftt.
This line has no leading whitespace, so i dont need any reapplied. Jjjxsrg bjlkdetyhk llhfftt`;

function addNewlines(str) { 
    var result = ''; 
    while(str.length > 0) { 
          result += str.substring(0, 25) + '<br />'; 
          str = str.substring(25); 
    } 

    return result; 
}

var newStr = addNewlines(str).toString();
document.getElementById("result").innerHTML = newStr;
i am a string that has ne
w lines and whitespace. I
need to preserve the lea
ding whitespace and add i
t back on after the strin
g has been broken up afte
r n characters. 

   This line has leading
   whitespace. Tttttt rr
   rrrr ttgvgggjjj. Gyjf
   ry bh jkkfrtuj hhdt i
   ihdrtttg. Here is ano
   ther line. Hjkkl gggd
   etu jcfgjbfftt. 

This line has no leading
 whitespace, so i dont n
 eed any reapplied. Jjjx
 srg bjlkdetyhk llhfftt