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('');

}

結果を1回短縮:

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

I believe what you're looking for is a script like this:

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

ループを続けてください。パーツを分割し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;
}
于 2012-11-21T19:45:39.537 に答える