Zitat von Quetschi
Beitrag anzeigen
Hier noch mal ein Versuch – in linewrap umbenannt, weil die Aufgabe der Funktion wirklich nur noch ist, Text nach x Zeichen umzubrechen, und dabei Original-Zeilenumbrüche beizubehalten. Eventuell vorhandener Whitespace am Ende von Zeilen wird entfernt.
PHP-Code:
function linewrap($str, $length) {
$breakchar = "\n";
$str = preg_replace("/(\r\n|\r)/u", "\n", $str); // Zeilenumbrüche zu \n vereinheitlichen
$parts = preg_split('/(\s+)/u', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); // split an Whitespace-Zeichen
$return = array('');
for($i=0, $line=0, $numparts=count($parts); $i<$numparts; $i+=2) {
$word = $parts[$i];
$space = isset($parts[$i+1]) ? $parts[$i+1] : '';
$newline = false;
if(strpos($space, "\n") !== false) { // wenn der Space nach dem Wort Zeilenumbrüche enthält, sonstigen Whitespace entfernen
$space = preg_replace("/[^\n]/", '', $space);
$newline = true;
}
if(mb_strlen($return[$line], 'UTF-8') + mb_strlen($word, 'UTF-8') <= $length) {
$return[$line] .= $word . $space;
}
else {
$return[$line] = rtrim($return[$line]) . $breakchar; // unnötigen Whitespace am Zeilenende entfernen, bevor Umbruch hinzugefügt wird
$return[++$line] = $word . $space;
}
if($newline) { // falls der Space Zeilenumbrüche enthielt, Zeilenzähler weiter setzen
$return[++$line] = '';
}
}
return rtrim(join('', $return));
}
Kommentar