拆分文本以每隔n个字符添加一行新行,并注意空格



为警报和确认对话框编写文本时的常见问题:添加换行符之前要键入的字符数。有些浏览器会在某一点自动中断,而另一些则会在其他点自动中断。所以你只能猜测了。有用的snippet是一个Javascript函数,它将警报或确认对话框的预期文本和字符长度作为输入,然后返回相同的输入字符串,只在与传入的字符长度最接近的位置添加新行字符。这样,单词就不会中途断开。

示例:
1.为要用于警报或确认对话框的文本字符串指定一个var,例如:
var a="我的狗身上有跳蚤——敏捷的棕色狐狸跳过懒狗等"
2.通过函数运行文本,例如:
a=断线(a);//默认值,每50个字符中断一次

a=断线(a,20);//每隔20个字符中断一次

在通过函数运行后显示"a"的值,您将看到在最靠近指定字符位置的空格字符处指定的每个位置都添加了换行符。例如,如果您指定20,"a"将转换为以下内容:

对于字符串中的每一行(一行是以换行符结尾的字符串的一部分),该行两边都会修剪掉空白。下面的代码片段使用jQuery$.trim()函数来实现这一点,但也有其他方法可以在不使用jQuery库的情况下实现,例如使用regexp。只需根据需要修改代码即可使用其他方法。

这就引出了我的问题:除了按照下面所示的方式做我想做的事情之外,还有没有一种更简单、更紧凑的方法,比如可以利用regexp的方法?有人接电话吗?

function breakLines(text, linelength)
{
 var linebreak = 'n';
 var counter = 0;
 var line = '';
 var returntext = '';
 var bMatchFound = false;
 var linelen = 50; // 50 characters per line is default
 if(linelength)
 {
  linelen = linelength;
 }
 if(!text){ return '';}
 if(text.length < linelen+1) { return $.trim(text);}
 while(counter < text.length)
 {
  line = text.substr(counter,linelen);
  bMatchFound = false;
  if (line.length == linelen)
  {
   for(var i=line.length;i > -1;i--)
   {
    if(line.substr(i,1)==' ')
    {
     counter += line.substr(0,i).length;
     line = $.trim(line.substr(0,i)) + linebreak;
     returntext += line;
     bMatchFound = true;
     break;
    }
   }
   if(!bMatchFound)
   {
    counter+=line.length;
    line = $.trim(line) + linebreak;
    returntext += line;
   }
  }
  else
  {
   returntext += $.trim(line);
   break; // We're breaking out of the the while(), not the for()
  }
 }
 return returntext;
}

没有参数验证的短版本

function explode(str, maxLength) {
    var buff = "";
    var numOfLines = Math.floor(str.length/maxLength);
    for(var i = 0; i<numOfLines+1; i++) {
        buff += str.substr(i*maxLength, maxLength); if(i !== numOfLines) { buff += "n"; }
    }
    return buff;
}

也许?

function breadLines( str, len )
{
    var len = len || 50, i, j, lines, count, lineBreak = 'n', out = [];
    if ( str.length < len )
        return str;
    lines = str.split(/s+/);
    for ( i=0, j=0, count=lines.length; i<count; i++ )
    {
        if ( ( out[j] + lines[i] ).length > len )
            j++, out.push("");
        out[j] += lines[i];
    }
    return out.join(lineBreak);
}

这应该做到:

function breaklines(str, n) {
    var lines = str.split(/s+/), // explode on whitespaces
        n = +n || 50;
    var res = [];
    for (var i=0; i<lines.length; ) {
        for (var l = 0, line = []; l + lines[i].length <= n; i++) {
            l += 1 + lines[i].length;
            line.push(lines[i]);
        }
        res.push(line.join(" "));
    }
    return res.join("n");
}

这个函数是递归的,而且更简单。它还处理文本中已经存在的换行符。它很短,没有环。

function explode (text, max) {
        if (text == null) return '';
    if (text.length <= max) return text;
    const nextNewLine = /n/.exec(text);
    const lineLength = nextNewLine ? nextNewLine.index: text.length;
    if (lineLength <=  max) {
        const line = text.substr(0, lineLength);
        const rest = text.substr(lineLength+1);
        return line + 'n'+  explode(rest, max);
    } else {
        let line = text.substr(0, max);
        let rest = text.substr(max);
        const res = (/([s])[^s]*$/.exec(line));
        if(res){ //
            line = text.substr(0, res.index);
            rest = text.substr(res.index+1);
        } else {
            line = line + "-";
        }
        return line + 'n'+  explode(rest, max);
    }
}

最新更新