kostenloser Webspace werbefrei: lima-city


Text in 2 Teile aufteilen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    kataloge

    kataloge hat kostenlosen Webspace.

    Hallo

    ich habe in einem Array Texte (String) die ca. zwischen 200 und 800 Zeichen lang sind.

    Wie kann ich den Text in 2 Absätze aufzeilen, die etwa gleich gross sind
    ... ohne dass der Text mitten im Wort abgeschnitten wird ?

    bisher habe ich es so

    $dlength = strlen($data['descr']); 
    $halblen = ceil($dlength/2); 
    $descarr = str_split( $data['descr'], $halblen );
    
    echo "<p> ".$descarr[0]." </p> \r\n";   // ----- Absatz 1 ----- 
    echo "<p> ".$descarr[1]." </p> \r\n";   // ----- Absatz 2 -----


    wie bekomme ich es hin,. das der Text nicht mitten in einem Wort getrennt wied?

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du kannst die Länge einfach durch 2 Teilen.
    Dann guckst du, ob da, wo of halber länge zufällig ein Leerzeichen ist.
    Wenn ja, dann ist alles super.
    Wenn nicht, dann kannst du strpos() benutzen, um das nächste Leerzeichen zu finden.
    http://php.net/strpos
    also sowas wie:
    $splitpos = strpos($data['descr'], " ", $halblen);
    Da bekommst du das erste Leerzeichen ab der Hälfte des Textes
  4. Autor dieses Themas

    kataloge

    kataloge hat kostenlosen Webspace.

    Danke
    so habe ich es jetzt gemacht und es klappt ganz gut

    $dlength      = strlen($data['descr']); 
    $halblen      = ceil($dlength/2); 
    $splitpos     = strpos($data['descr'], " ", $halblen);
    $descparts    = str_split($data['descr'], $splitpos);
    
    $desc_part1   = trim($descarr[0]);
    $desc_part2   = trim($descarr[1]);
    
    echo "<p> ".$desc_part1." </p> \r\n";   // ----- Absatz 1 ----- 
    echo "<p> ".$desc_part1." </p> \r\n";   // ----- Absatz 2 -----


    aber bei sehr langen Texten würde ich gerne noch mehr Absätze machen,
    quasi die Anzahl der Absätze (Text-Teile) dynamisch je nach Text-Gesamt-Länge.

    Ein Absatz soll dabei z.B. maximal 300 Zeichen haben
    wenn also der Text 1000 Zeichen hat, dann will ich 4 Absätze bekommen
    ... wie gehe ich das am besten an?



    Beitrag zuletzt geändert: 14.4.2012 11:20:37 von kataloge
  5. w*****e

    Du berechnest in welchem Abstand von Zeichen ein Absatz sein muss und veränderst dementsprechend in einer for() Schleife die Anzahl und den Ort der Absätze
  6. Autor dieses Themas

    kataloge

    kataloge hat kostenlosen Webspace.

    webaffe schrieb:
    Du berechnest in welchem Abstand von Zeichen ein Absatz sein muss und veränderst dementsprechend in einer for() Schleife die Anzahl und den Ort der Absätze


    Hallo

    ja, habe schon mit for Schleife rumprobiert,
    Problem ist,nach dem Text abschneiden bei letzes Leerzeichen in 300 Zeichen Block
    muss die nächste Start-Pos um die (nach dem Leerzeichen) nicht verwendeten Zeichen
    angepasst werden, also nächste Start-Pos um diese Anzahl verschieben
    garnicht so einfach

    und dann hab was gefunden, was das gleiche macht wie meine for Schleife sollte
    wordwrap()

    $partlen   = 300;    // --- länge Je Text-Block ---
    $trenner   = '~';    // --- ein Trenner-Zeichen, das nicht im $text vorkommt 
    
    $neuertext = wordwrap( $text, $partlen, $trenner );
    
    $textarray = explode($trenner,$neuertext); 
    
    ## echo "<pre>\n"; 
    ## print_r($textarray);  
    ## echo "</pre>\n"; 
    
    foreach($textarray as $tpart) { 
        echo "<p>".$tpart."</p>\n"; 
    }


    ... eigentlich ganz einfach


    ABER noch nicht schön .... die Absätze werden mitten im Satz umgebrochen,

    lieber wäre mir Umbrauch (neuer Text-Teil) nicht bei Leerzeichen, sondern bei Satzende (. Punkt)
    nur Probleme dabei sind,
    was ist, wenn ein Satz länger als 300 Zeichen ist, also kein Punkt kommt ...
    dann muss es halt doch das letze Leerzeichen nehmen,
    und was wenn im Text ein Zahlenwert wie 12.5 steht bzw. anderer Text mit Punkt der kein Satzende ist
    ... evtl mit Punkt + Leerzeichen als Trenner






    Beitrag zuletzt geändert: 14.4.2012 11:30:04 von kataloge
  7. w*****e

    kataloge schrieb:
    webaffe schrieb:
    Du berechnest in welchem Abstand von Zeichen ein Absatz sein muss und veränderst dementsprechend in einer for() Schleife die Anzahl und den Ort der Absätze


    Hallo

    ja, habe schon mit for Schleife rumprobiert,
    Problem ist,nach dem Text abschneiden bei letzes Leerzeichen in 300 Zeichen Block
    muss die nächste Start-Pos um die (nach dem Leerzeichen) nicht verwendeten Zeichen
    angepasst werden, also nächste Start-Pos um diese Anzahl verschieben
    garnicht so einfach

    und dann hab was gefunden, was das gleiche macht wie meine for Schleife sollte
    wordwrap()

    $partlen   = 300;    // --- länge Je Text-Block ---
    $trenner   = '~';    // --- ein Trenner-Zeichen, das nicht im $text vorkommt 
    
    $neuertext = wordwrap( $text, $partlen, $trenner );
    
    $textarray = explode($trenner,$neuertext); 
    
    ## echo "<pre>\n"; 
    ## print_r($textarray);  
    ## echo "</pre>\n"; 
    
    foreach($textarray as $tpart) { 
        echo "<p>".$tpart."</p>\n"; 
    }


    ... eigentlich ganz einfach


    ABER noch nicht schön .... die Absätze werden mitten im Satz umgebrochen,

    lieber wäre mir Umbrauch (neuer Text-Teil) nicht bei Leerzeichen, sondern bei Satzende (. Punkt)
    nur Probleme dabei sind,
    was ist, wenn ein Satz länger als 300 Zeichen ist, also kein Punkt kommt ...
    dann muss es halt doch das letze Leerzeichen nehmen,
    und was wenn im Text ein Zahlenwert wie 12.5 steht bzw. anderer Text mit Punkt der kein Satzende ist
    ... evtl mit Punkt + Leerzeichen als Trenner






    Dann musst dumit einer if() {} else {} Anweisung arbeiten und das Problem mit dem 12.5 kannst du durch einen regulären Ausdruck beheben.
  8. Sowas in der Richtung hätte ich mir jetzt überlegt:

    function splitStringByLength($inputString, $maxLength) {
         $i=0;
         $j=0;
         $testString = implode(" ", $inputString);
         foreach($testString as $currentString) {
              if($j - $i + count($currentString) > $maxLength) {
                   $output[] = substr ($inputString, $i , $j-$i)
                   $i = $j;
              }
              $j += count($currentString) + 1;
         }
         $output[] = substr ($inputString, $i , count($inputString)-$i)
         return $output;
    }


    Ansonsten irgendwas mit strripos() und substr().

    while($j < count($inputString)) {
       $j = strripos(substr($inputString, $i, 300)) + 1;
       $output[] = substr ($inputString, $i , $j);
       $i += $j;
    }


    Kann sein, dass da die Längen noch nicht richtig hinhauen und irgendwo noch ein +1 in die Scheifen rein muss und der Reststring noch nicht ganz richtig verarbeitet wird.

    //edit
    Man sollte den gesamten Thread lesen, wordwrap also ... -.-
    Du kannst ja eine Gewisse Intelligenz einbauen. Dann suchst du mit strripos erst nach dem letzten Punkt und entscheides dann, ob er nach Punkt oder Leerzeichen trennen soll, je nachdem wie weit die beiden auseinanderliegen. Oder du suchst schon im nächsten Teil nach dem nächsten Punkt und wenn der nur 2 Wörter später kommt trennst du lieber nach Punkt anstatt Leerzeichen. So in etwa.

    //edit2
    Natürlich is das erste Beispiel Käse, weil man irgendwie wieder mit Explode an den Ursprungsstring ran muss.

    Beitrag zuletzt geändert: 14.4.2012 12:54:56 von travianinc
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!