0

我已经改编了从另一个项目中提取的 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."
4

3 回答 3

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;
}
于 2012-11-21T20:03:50.227 回答
3

我相信您正在寻找的是这样的脚本:

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);​
于 2012-11-21T19:53:13.760 回答
1

继续循环。与其断开和返回零件,不如将它们从数组中拼接出来,重置宽度计数并将它们推送到结果数组上startlast

另请注意,除了在 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;
}
于 2012-11-21T19:45:39.537 回答