Funktion wordwrap() - Zeilenumbrüche in Strings einfügen

Auf Websites können lange Texte in einer Zeile vorkommen. Für die Darstellung am Bildschirm spielt das keine Rolle, da diese automatisch umgebrochen werden. Im Quellcode selbst verbleiben sie jedoch so wie sie sind. Es kann der Fall eintreten, in dem man nach einer gewissen Anzahl an Zeichen im Quellcode bzw. bei der internen Verarbeitung mit PHP Zeilenumbrüche einfügen möchte. Das kann z.B. dann notwendig sein, wenn der Quellcode gut lesbar sein soll. In solchen Fällen kann man die PHP-Funktion wordwrap() verwenden. Die Parameter werden wie folgt angegeben.

  1. Die Zeichenkette, in der die Zeilenumbrüche eingefügt werden sollen (string).
  2. Anzahl der Zeichen, nach der jeweils ein Zeilenumbruch erfolgen soll (width, optional).
  3. Ein String, der bei jedem Zeilenumbruch eingefügt werden soll (break, optional).
  4. Boolescher Wert, mit dem angegeben wird, ob längere Wörter getrennt werden sollen (cut, optional).

Falls der zweite Parameter nicht angegeben wird, gilt als Standardwert 75. Der String, der standardmäßig bei jedem Zeilenumbruch eingefügt wird, ist "\n", sodass jeweils ein Zeilenumbruch eingefügt wird. Beim folgenden Beispiel erfolgt der Zeilenumbruch nach dem 6. Zeichen. Dass die Texte untereinander stehen, kann man im Quelltext nachvollziehen.

<?php

$str = 'Langer Text';

// Ausgabe untereinander Langer Text
echo wordwrap($str, 6);

?>

Mit dem dritten Parameter kann man vom Standard "\n" abweichen und einen String vorgeben, der mit jedem Zeilenumbruch automatisch eingefügt werden soll. Beispielsweise wird an dieser Stelle häufig der HTML-Code für Zeilenumbrüche <br> eingefügt, damit bei der Anzeige der Website ebenfalls Zeilenumbrüche vorhanden sind.

<?php

$str = 'Langer Text';

// Ausgabe Langer<br>Text
echo wordwrap($str, 6, '<br>'); 

?>

Zu beachten ist hierbei, dass mit <br> für die Darstellung der Website ein Zeilenumbruch erzeugt wird, im Quellcode jedoch nicht. In diesem Beispiel wird im Quellcode einzeilig Langer<br>Text ausgegeben. Falls auch im Quellcode ein Zeilenumbruch erfolgen soll, so muss man zusätzlich das Steuerzeichen \n angeben. Außerdem muss der dritte Parameter in doppelten Anführungszeichen gesetzt werden und nicht in einfachen, da ansonsten \n als Text interpretiert wird.

<?php

$str = 'Langer Text';

// Ausgabe untereinander Langer<br>Text
echo wordwrap($str, 6, "<br>\n"); 

?>

Der vierte Parameter beeinflusst Wörter, die länger sind als die im zweiten Parameter angegebene Länge. In der Standardeinstellung werden lange Wörter nicht umgebrochen und das entspricht dem booleschen Wert FALSE. Beim folgenden Beispiel ist als zweiter Parameter 4 angegeben. Das Wort ist jedoch länger, wird jedoch nicht umgebrochen.

<?php

$str = 'SehrlangesWort';

// Ausgabe SehrlangesWort
echo wordwrap($str, 4, "<br>\n"); 

?>

Der Unterschied wird deutlich, wenn man den vierten Parameter auf TRUE setzt. In dem Fall wird das Wort jeweils nach dem vierten Zeichen umgebrochen. Das kann dazu führen, dass der Text nicht besonders leserlich ist.

<?php

$str = 'SehrlangesWort';

// Ausgabe untereinander Sehr<br>lang<br>esWo<br>rt
echo wordwrap($str, 4, "<br>\n", TRUE); 

?>

Der Umbruch erfolgt nicht anhand der Zeichen, sondern anhand der Bytes, die diese belegen. Dabei wird davon ausgegangen, dass 1 Byte von einem Zeichen belegt wird. Umlaute (oder andere Multibyte-Zeichen) in der Zeichenkodierung UTF-8 belegen jedoch nicht 1 Byte, sondern 2. Das kann dazu führen, dass der Zeilenumbruch nicht an der gewünschten Stelle erfolgt. Beim folgenden Beispiel enthält die Variable $str den String äöüßäöüß. Der Umbruch erfolgt jeweils nach zwei Zeichen.

<?php
$str = 'äöüßäöüß';

// Ausgabe untereinander äö<br>üß<br>äö<br>üß
echo wordwrap($str, 4, "<br>\n", TRUE);

?>

Damit auch die Umlaute korrekt umgebrochen werden, kann man eine eigene Funktion schreiben. Es gibt dabei mehrere Lösungsansätze. Beim folgenden Beispiel sorgt die Funktion wordwrap_utf8() dafür, dass auch die Umlaute als 1 Zeichen gezählt und dementsprechend umgebrochen werden.

<?php

function wordwrap_utf8($string, $width=75, $break="\n", $cut=FALSE)
{
  if($cut) {
    $search = '/(.{1,'.$width.'})(?:\s|$)|(.{'.$width.'})/uS';
    $replace = '$1$2'.$break;
  } 
  else
  {
    $pattern = '/(?=\s)(.{1,'.$width.'})(?:\s|$)/uS';
    $replace = '$1'.$break;
  }
  return preg_replace($search, $replace, $string);
}

$str = 'äöüßäöüß';

// Ausgabe untereinander äöüß<br>äöüß
echo wordwrap_utf8($str, 4, "<br>\n", TRUE);

?>

Der Zeilenumbruch erfolgt in diesem Beispiel nach äöüß und nicht wie bei der Standardlösung nach jedem zweiten Zeichen.