将文本拆分为多个部分JavaScript

时间:2012-11-21 19:32:33

标签: javascript split slice

我已经改编了从另一个项目中提取的PHP脚本,以便在JavaScript中使用,这个脚本非常适合将文本缩短到设定的限制。如果超过设定限制,我想用它将它分成多个部分。

缩短一次的当前代码在这里:http://jsfiddle.net/WilliamIsted/P5jxK/

这是我到目前为止所拥有的:http://jsfiddle.net/WilliamIsted/UkhXL/(我很确定我做得不对)

我已经陷入了几次或多次循环,我不知道如何继续进行。

function strTruncate($string, $your_desired_width) {

    arr = [];

    if (typeof($last_part)) {
        $last_part = 0;
    }

    $parts = $string.split(/([\s\n\r]+)/);
    $parts_count = $parts.length;

    $length = 0;
    $last_part = 0;
    for (; $last_part < $parts_count; ++$last_part) {
        $length += $parts[$last_part].length;
        if ($length > $your_desired_width) {
            break;
        }
    }

    $start_part = 0;

    return $parts.slice($start_part, $last_part).join('');

}

缩短一次结果:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada, est ut interdum ullamcorper, metus lorem interdum ipsum, vitae

新的预期结果:

array[0] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada, est ut interdum ullamcorper, metus lorem interdum ipsum, vitae",
array[1] = "vulputate ante quam ut augue. Praesent sit amet varius lorem. Aliquam odio nunc, mattis in mollis vitae, laoreet non velit. Curabitur"
array[2] = "adipiscing, nisl tincidunt consequat ornare, ligula mauris sed."

3 个答案:

答案 0 :(得分:4)

你的代码有点乱,它可以改写成这样的东西

function strTruncate(string, width) { // your original function
    string = string.replace(/[\s\r\n]+/, ' ');
    if(string.length >= width) {
        return string[width-1] === ' ' ? string.substr(0, width - 1) : string.substr(0, string.substr(0, width).lastIndexOf(' '));
    }
    return string;
}
function strTruncateWhole(string, width) { // function that stores result(s) in array
    arr = [];
    string = string.replace(/[\s\r\n]+/, ' ');
    var b = 0;
    while(b < string.length) {
        arr.push(strTruncate(string.substring(b), width));
        b += arr[arr.length-1].length;
    }
    return arr;
}

答案 1 :(得分:2)

我相信你要找的是这样的剧本:

function strSplitOnLength(data, your_desired_width) {
    if(data.length <= 0)
        return [];  // return an empty array

    var splitData = data.split(/([\s\n\r]+)/);
    var arr = [];
    var cnt = 0;
    for (var i = 0; i < splitData.length; ++i) {
        if (!arr[cnt]) arr[cnt] = '';  //Instantiate array entry to empty string if null or undefined

        if (your_desired_width < (splitData[i].length + arr[cnt].length))
            cnt++;

        arr[cnt] += splitData[i];
    }

    return arr;
}

strSplitOnLength('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer malesuada, est ut interdum ullamcorper, metus lorem interdum ipsum, vitae vulputate ante quam ut augue. Praesent sit amet varius lorem. Aliquam odio nunc, mattis in mollis vitae, laoreet non velit. Curabitur adipiscing, nisl tincidunt consequat ornare, ligula mauris sed.', 140);​

答案 2 :(得分:1)

继续循环。不要将部件从start分解并返回到last,而是将它们从数组中拼接出来,重置宽度计数并将它们推到结果数组上。

另请注意,除了在PHP中,您需要使用var声明所有局部变量;并且没有布尔typeof函数,但是返回字符串"undefined"的关键字(不知道你想在那里做什么)。

function strTruncate(str, maxWidth) { // not sure whether that's the best name
    var resultArr = [];
    var parts = str.split(/([\s\n\r]+)/);
    var count = parts.length;
    var width = 0;
    var start = 0;
    for (var i=0; i<count; ++i) {
        width += parts[i].length;
        if (width > maxWidth) {
            resultArr.push( parts.slice(start, i).join('') );
            start = i;
            width = 0;
        }
    }
    return resultArr;
}