2012-11-21 66 views
0

我已經調整了從另一個項目中提取的用於JavaScript的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." 
+1

請在這裏發佈你的代碼,而不是在一些不相關的頁面上。一個額外的演示很好,但相關的代碼屬於這個問題。 – Bergi

+2

請用'.length'替換'.count()'的所有用法。它傷害:-) – Bergi

+0

@Bergi良好的調用,我試過'.length()'之前,顯然沒有工作。 –

回答

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);​ 
+0

這個功能看起來不錯,謝謝 –

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; 
} 
+0

您正在返回'resultArr',但從未填充它 – nybbler

+0

@nybbler:謝謝;太多的c&p。 – Bergi

+0

這很好,但它只返回2個數組,是否有可能返回更多? –

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; 
} 
+0

最佳答案!謝謝 – silly

+0

這個功能不如它有時會分開單詞。更好的是https://stackoverflow.com/a/7624821/712347 –