2012-06-29 40 views
14

我在寻找沿PHP:没有打破的话分割的长字符串

str_split_whole_word($longString, x) 

所在行$longString是句子的集合东西,x是每行的字符长度。它可能相当长,我想基本上将它分成多行,形式为数组。

因此,例如,

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.'; 
$lines = str_split_whole_word($longString, x); 

$lines = Array(
    [0] = 'I like apple. You' 
    [1] = 'like oranges. We' 
    [2] = and so on... 
) 

回答

12

该解决方案可确保行会不会破坏词来创建的,你不会得到使用换行()。 它将使用空格来爆炸字符串,然后使用foreach来循环数组并创建线条而不破坏作品,并使用$maxLineLength定义最大长度。下面是代码,我做了一些测试,它工作正常。

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.'; 

$arrayWords = explode(' ', $longString); 

$maxLineLength = 18; 

$currentLength = 0; 
$index = 0; 

foreach ($arrayWords as $word) { 
    // +1 because the word will receive back the space in the end that it loses in explode() 
    $wordLength = strlen($word) + 1; 

    if (($currentLength + $wordLength) <= $maxLineLength) { 
     $arrayOutput[$index] .= $word . ' '; 

     $currentLength += $wordLength; 
    } else { 
     $index += 1; 

     $currentLength = $wordLength; 

     $arrayOutput[$index] = $word; 
    } 
} 
+2

Marcio,谢谢你的帮助。这有助于你的描述! – musicliftsme

+0

@ user796837,Nevermind,很高兴为您效劳! –

38

最简单的解决办法是在新的生产线使用wordwrap(),并explode(),像这样:

$array = explode("\n", wordwrap($str, $x)); 

$x是一个数字的字符来包装的字符串开启。

+10

这是如此简单难忘;应该是被接受的答案! –

+2

如果您在字符串中没有换行符,这会很好用。 – BakerStreetSystems

7

使用wordwrap()插入换行符,然后explode()这些换行:

// Wrap at 15 characters 
$x = 15; 
$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.'; 
$lines = explode("\n", wordwrap($longString, $x)); 

var_dump($lines); 
array(6) { 
    [0]=> 
    string(13) "I like apple." 
    [1]=> 
    string(8) "You like" 
    [2]=> 
    string(11) "oranges. We" 
    [3]=> 
    string(13) "like fruit. I" 
    [4]=> 
    string(10) "like meat," 
    [5]=> 
    string(5) "also." 
} 
+0

正是我想要的:)谢谢! – Harsha

1

制造功能马尔西奥思茅评论

function explodeByStringLength($string,$maxLineLength) 
{ 
    if(!empty($string)) 
    { 
     $arrayWords = explode(" ",$string); 

     if(count($arrayWords) > 1) 
     { 
      $maxLineLength; 
      $currentLength = 0; 

      foreach($arrayWords as $word) 
      { 
       $wordLength = strlen($word); 
       if(($currentLength + $wordLength) <= $maxLineLength) 
       { 
        $currentLength += $wordLength; 
        $arrayOutput[] = $word; 
       } 
       else 
       { 
        break; 
       } 
      } 

      return implode(" ",$arrayOutput); 
     } 
     else 
     { 
      return $string; 
     }  
    } 
    else return $string; 
} 
1

尝试这个功能.......

<?php 
/** 
* trims text to a space then adds ellipses if desired 
* @param string $input text to trim 
* @param int $length in characters to trim to 
* @param bool $ellipses if ellipses (...) are to be added 
* @param bool $strip_html if html tags are to be stripped 
* @param bool $strip_style if css style are to be stripped 
* @return string 
*/ 
function trim_text($input, $length, $ellipses = true, $strip_tag = true,$strip_style = true) { 
    //strip tags, if desired 
    if ($strip_tag) { 
     $input = strip_tags($input); 
    } 

    //strip tags, if desired 
    if ($strip_style) { 
     $input = preg_replace('/(<[^>]+) style=".*?"/i', '$1',$input); 
    } 

    if($length=='full') 
    { 

     $trimmed_text=$input; 

    } 
    else 
    { 
     //no need to trim, already shorter than trim length 
     if (strlen($input) <= $length) { 
     return $input; 
     } 

     //find last space within length 
     $last_space = strrpos(substr($input, 0, $length), ' '); 
     $trimmed_text = substr($input, 0, $last_space); 

     //add ellipses (...) 
     if ($ellipses) { 
     $trimmed_text .= '...'; 
     }  
    } 

    return $trimmed_text; 
} 
?> 

信用:http://www.ebrueggeman.com/blog/abbreviate-text-without-cutting-words-in-half

+1

至少为此添加功劳:http://www.ebrueggeman.com/blog/abbreviate-text-without-cutting-words-in-half –