2012-06-29 21 views
14

Ich bin für etwas entlang der Linie vonPHP: split eine lange Zeichenfolge, ohne zu brechen Worte

str_split_whole_word($longString, x) 

, wo $longString eine Sammlung von Sätzen, und x ist die Zeichenlänge für jede Zeile. Es kann ziemlich lang sein, und ich möchte es in mehrere Zeilen in Form eines Arrays teilen.

So zum Beispiel,

$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... 
) 

Antwort

12

Diese Lösung stellt sicher, dass die Linien, ohne zu brechen Wörter erstellt werden, was Sie nicht wordwrap erhalten wird() verwenden. Es wird das Leerzeichen verwenden, um die Zeichenfolge zu explodieren, und dann eine Foreach verwenden, um das Array zu loopen und die Zeilen ohne Unterbrechung zu erstellen und mit einer maximalen Länge, die $maxLineLength definiert wird. Unten ist der Code, ich habe einige Tests gemacht und es funktioniert gut.

$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, danke für deine Hilfe. Das hilft genau so, wie du es beschrieben hast! – musicliftsme

+0

@ user796837, Nevermind, ich bin froh, Ihnen zu helfen! –

38

Die einfachste Lösung ist wordwrap() und explode() auf die neue Linie zu verwenden, etwa so:

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

Wo $x ist eine Anzahl von Zeichen der einzuwickeln Schnur an.

+10

Das ist so einfach und unvergesslich; sollte die akzeptierte Antwort sein! –

+2

Das würde gut funktionieren, wenn Sie keine Zeilenumbrüche in der Zeichenfolge haben. – BakerStreetSystems

7

Verwenden wordwrap() die Zeilenumbrüche einfügen, dann explode() auf diesen Zeilenumbrüchen:

// 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

Genau was ich will :) Danke! – Harsha

1

Hergestellt Funktion von Marcio simao Kommentar

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

Diese Funktion Versuchen .......

<?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; 
} 
?> 

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

+1

Zumindest Kredit hinzufügen: http://www.ebrueggeman.com/blog/abbreviate-text-without-cutting-words-in-half –

Verwandte Themen