拆分文本,每隔n个字符添加一个新行,处理空格

时间:2012-09-14 14:00:44

标签: javascript string replace split

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

例:
1.将var分配给要用于警报或确认对话框的文本字符串,例如:     var a =“我的狗有跳蚤,快速的棕色狐狸跳过懒狗等”; 2.通过该功能运行文本,例如:
    a = breakLines(a); //默认,每50个字符中断 或
    a = breakLines(a,20); //打破每20个字符

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

'我的狗有跳蚤\快速的棕色狐狸\ njumps over the lazy \ ndog etc'

对于字符串中的每一行(一行是以新行字符结尾的字符串的一部分),该行将在两侧修剪为空白。下面的代码片段使用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;
}

5 个答案:

答案 0 :(得分:1)

也许?

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);
}

答案 1 :(得分:1)

Here是一个使用递归的评论解决方案(23行没有评论,38条为你的):

function explode(text, max) {
    // clean the text
    text = text.replace(/  +/g, " ").replace(/^ /, "").replace(/ $/, "");
    // return empty string if text is undefined
    if (typeof text === "undefined") return "";
    // if max hasn't been defined, max = 50
    if (typeof max === "undefined") max = 50;
    // return the initial text if already less than max
    if (text.length <= max) return text;
    // get the first part of the text
    var exploded = text.substring(0, max);
    // get the next part of the text
    text = text.substring(max);
    // if next part doesn't start with a space
    if (text.charAt(0) !== " ") {
        // while the first part doesn't end with a space && the first part still has at least one char
        while (exploded.charAt(exploded.length - 1) !== " " && exploded.length > 0) {
            // add the last char of the first part at the beginning of the next part
            text = exploded.charAt(exploded.length - 1) + text;
            // remove the last char of the first part
            exploded = exploded.substring(0, exploded.length - 1);
        }
        // if the first part has been emptied (case of a text bigger than max without any space)
        if (exploded.length == 0) {
            // re-explode the text without caring about spaces
            exploded = text.substring(0, max);
            text = text.substring(max);
        // if the first part isn't empty
        } else {
            // remove the last char of the first part, because it's a space
            exploded = exploded.substring(0, exploded.length - 1);
        }
    // if the next part starts with a space
    } else {
        // remove the first char of the next part
        text = text.substring(1);
    }
    // return the first part and the exploded next part, concatenated by \n
    return exploded + "\n" + explode(text);
}

呼叫:

var text = "               My dog has    fleas the quick brown fox jumps over the lazy dog etc";
var exploded = explode(text);
console.log(exploded);

打印:

  

我的狗跳蚤快速的棕色狐狸跳过

     

懒狗等

答案 2 :(得分:1)

没有参数验证的简短版本

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;
}

答案 3 :(得分:0)

这应该这样做:

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");
}

答案 4 :(得分:0)

此函数是递归的,并且简单得多。它还处理文本中已经存在的换行符。它很短,没有循环。

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);
    }
}