Sakur Enseleit: Frage zu diesem Zeilenumbruchscript

Hallo Forum!

Habe folgende Funktion um Zeilen, die länger als 45 Zeichen sind, in meinem Gästebuch umzubrechen:

function cut_long_word ($text,$len=40){
 $neutext=$text;
 do {
  $text=$neutext;
  $neutext=preg_replace('~(^|\s)(\S{'.$len.'})(\S)~S', '\1\2 \3', $text);
 }
 while ($neutext!=$text);
 return $neutext;
}

$text="jadshvkshdajhsfajhshsdjhasjbahjwafwrtzwrhgkejgasdfvkadfsgvkg";
Aufruf cut_long_word($text,45);

Das Problem ist, dass auch HTML Entitäten und HTML Zeichen (zb. wenn jemand einen Link einbaut) umgebrochen werden. Kann man diese Funktion irgendwie so ändern, das HTML Entitäten als 1 Zeichen gezählt und HTML Code überhaupt ausgelassen wird? Denn der ist ja dann im sichtbaren Text nicht für die Wortlänge ausschlaggebend.

Viel Hoffnung habe ich ja nicht, aber fragen kostet nichts :)

Schönen Abend noch!

  1. Hi,

    $neutext=preg_replace('~(^|\s)(\S{'.$len.'})(\S)~S', '\1\2 \3', $text);

    Statt alles mit einem einzigen regular expression zu erledigen,
    kannst Du natürlich Deinen Text Zeichen für Zeichen parsen und dann
    beliebig komplizierte Verarbeitungslogiken umsetzen.

    Wenn das nächste Zeichen _kein_ '&' ist, dann ist es eigenständig,
    ansonsten leitet es eine Entität ein, die bis zum (hoffentlich vor-
    handenen!) schließenden ';' reicht (oder bis vor den nächsten Nicht-
    Buchstaben, falls das Semikolon fehlt ... ?).

    Nun hast Du das nächste Zeichen und kannst prüfen, ob es noch in die
    aktuelle Zeile paßt, d. h. ob die Zahl der dort bereits akzeptierten
    Zeichen, die Du jeweils um 1 erhöhst, noch kleiner als Dein zulässiger
    Maximalwert ist.

    Nebenbei findest Du auch gleich alle nicht korrekt terminierten Entitäten.

    Viele Grüße
          Michael

  2. Hallo,

    versuchs mal so, müste eigentlich funktionieren, habe leider gerade keinen Parser zur Hand.

    <?php
     function cut_long_word($text,$stelle) {
      $mod=get_html_translation_table (HTML_SPECIALCHARS);
      $mod = array_flip($mod);
      $text=strtr($text,$mod);
      $text=chunk_split($text,$stelle);
      $mod = array_flip($mod);
      $text=strtr($text,$mod);
      $text=nl2br($text);
      return $text;
     }
    ?>