美好的一天,
我想知道是否有一种简单的方法来分块/分割字符串而不会破坏单词.
例如:
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.";
Run Code Online (Sandbox Code Playgroud)
如果我打破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."];
Run Code Online (Sandbox Code Playgroud)
我找到了非常好的代码:
//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);
}
Run Code Online (Sandbox Code Playgroud)
但我真的怀疑我可以修改它,所以单词不会被打破.有小费吗?
谢谢!
这里有一些蛮力代码可以做到:
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);
}
Run Code Online (Sandbox Code Playgroud)
如果此例程遇到的单个字长于所需的行长度,它将自行将它放在一行上并且不会将其分解.
你可以在这里玩它:http://jsfiddle.net/jfriend00/fbaLe/
小智 8
感谢orourkedd,它非常有用。我刚刚用分裂更新了它。
private chunkString(str, len) {
let input = str.trim().split(' ');
let [index, output] = [0, []]
output[index] = '';
input.forEach(word => {
let temp = `${output[index]} ${word}`.trim()
if (temp.length <= len) {
output[index] = temp;
} else {
index++;
output[index] = word;
}
})
return output
}
Run Code Online (Sandbox Code Playgroud)
这建立在@ 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;
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西?
var n = 80;
while (n) {
if (input[n++] == ' ') {
break;
}
}
output = input.substring(0,n).split(' ');
console.log(output);
Run Code Online (Sandbox Code Playgroud)
更新
现在我重新阅读了这个问题,这是一个更新的解决方案:
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));
Run Code Online (Sandbox Code Playgroud)