2012-11-21 38 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 –