日安,
我想知道是否有一种简单的方法可以在不打断单词的情况下分块/拆分字符串。
例:
var input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin placerat, nisi nec vulputate scelerisque, metus lectus ultricies massa, et luctus elit libero eu erat. Fusce vitae sem lacus, eu ullamcorper lectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.";如果我打断80个字符长的,应该返回这样的数组
var output = ["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin placerat, nisi",
"nec vulputate scelerisque, metus lectus ultricies massa, et luctus elit libero",
"eu erat. Fusce vitae sem lacus, eu ullamcorper lectus. Lorem ipsum dolor sit",
"amet, consectetur adipiscing elit."];我发现了非常好的代码:
//http://phpjs.org/functions/chunk_split:369
function chunk_split (body, chunklen, end) {
// Returns split line
//
// version: 1103.1210
// discuss at: http://phpjs.org/functions/chunk_split
// + original by: Paulo Freitas
// + input by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Theriault
// * example 1: chunk_split('Hello world!', 1, '*');
// * returns 1: 'H*e*l*l*o* *w*o*r*l*d*!*'
// * example 2: chunk_split('Hello world!', 10, '*');
// * returns 2: 'Hello worl*d!*'
chunklen = parseInt(chunklen, 10) || 76;
end = end || '\r\n';
if (chunklen < 1) {
return false;
}
return body.match(new RegExp(".{0," + chunklen + "}", "g")).join(end);
}但我真的很怀疑我是否能修改它,这样单词就不会被撕成两半。有小费吗?
谢谢!
发布于 2011-07-09 04:41:59
像这样吗?
var n = 80;
while (n) {
if (input[n++] == ' ') {
break;
}
}
output = input.substring(0,n).split(' ');
console.log(output);已更新
现在我重读了这个问题,下面是一个更新的解决方案:
var len = 80;
var curr = len;
var prev = 0;
output = [];
while (input[curr]) {
if (input[curr++] == ' ') {
output.push(input.substring(prev,curr));
prev = curr;
curr += len;
}
}
output.push(input.substr(prev)); 发布于 2011-07-09 04:37:58
下面是一些能做到这一点的暴力代码:
function splitIntoLines(input, len) {
var i;
var output = [];
var lineSoFar = "";
var temp;
var words = input.split(' ');
for (i = 0; i < words.length;) {
// check if adding this word would exceed the len
temp = addWordOntoLine(lineSoFar, words[i]);
if (temp.length > len) {
if (lineSoFar.length == 0) {
lineSoFar = temp; // force to put at least one word in each line
i++; // skip past this word now
}
output.push(lineSoFar); // put line into output
lineSoFar = ""; // init back to empty
} else {
lineSoFar = temp; // take the new word
i++; // skip past this word now
}
}
if (lineSoFar.length > 0) {
output.push(lineSoFar);
}
return(output);
}
function addWordOntoLine(line, word) {
if (line.length != 0) {
line += " ";
}
return(line += word);
}如果这个例程遇到一个比所需的行长更长的单词,它就会将它单独放在一行上,而不会把它分开。
你可以在这里玩:http://jsfiddle.net/jfriend00/fbaLe/
发布于 2013-07-03 17:39:11
这是建立在@steve的回答之上的,但是它会拆分字符串,尊重单词中断,这样字符串就不会超过指定的长度。这更像是一个普通的单词包装。
function chunkString(s, len)
{
var curr = len, prev = 0;
output = [];
while(s[curr]) {
if(s[curr++] == ' ') {
output.push(s.substring(prev,curr));
prev = curr;
curr += len;
}
else
{
var currReverse = curr;
do {
if(s.substring(currReverse - 1, currReverse) == ' ')
{
output.push(s.substring(prev,currReverse));
prev = currReverse;
curr = currReverse + len;
break;
}
currReverse--;
} while(currReverse > prev)
}
}
output.push(s.substr(prev));
return output;
}https://stackoverflow.com/questions/6632530
复制相似问题