Funktion trim() - Zeichen am Anfang und Ende entfernen

Bei der Verarbeitung von Zeichenketten ist es häufig erforderlich, am Anfang und/oder am Ende einer Zeichenkette bestimmte Zeichen zu entfernen. Ein typisches Beispiel hierfür sind Leerzeichen am Ende, die häufig beim Ausfüllen von Formularen durch Kopieren und Einfügen entstehen und für den Benutzer nicht ersichtlich sind bzw. keine Rolle spielen.

Eine Zeichenkette mit einem Leerzeichen am Anfang oder Ende ist jedoch technisch gesehen etwas anderes als ohne und das kann wiederum zu Inkonsistenzen bei der Verarbeitung führen, z.B. bei der Ausführung einer Suchfunktion. Es obliegt dem Programmierer, solche unerwünschten Zeichen zu entfernen. Ein gutes Mittel hierfür bietet die Funktion trim(). Damit ist es möglich, in einer Zeichenkette bestimmte Zeichen zu entfernen, die am Anfang oder am Ende vorkommen. Innerhalb der runden Klammern wird die Zeichenkette bzw. die Variable angegeben. Optional kann man nach einem Komma ein oder mehrere Zeichen angeben, die entfernt werden sollen.

Gibt man als zweiten Parameter die zu entfernenden Zeichen nicht an, werden standardmäßig alle sogenannten whitespaces entfernt, womit man Leerräume wie Leerzeichen, Tabulatorzeichen, Nullzeichen, Zeilenvorschubzeichen, Wagenrücklaufzeichen und den vertikalen Tabulator bezeichnet. Beim folgenden Code enthält die Variable $str einige whitespaces. Zum Test erfolgt die Ausgabe der Variable einmal ohne und einmal mit der Funktion trim(). Mit trim() erfolgt die Ausgabe ohne whitespaces am Anfang und am Ende der Zeichenkette. Der Unterschied ist nach dem Aufruf der PHP-Seite im Quellcode ersichtlich.

<?php

$str = " Zeichenkette \t \n \r \0 \x0B ";

// Ohne trim
echo $str . '<br>';

// Mit trim
echo trim($str) . '<br>';

?>

Zu entfernende Zeichen vorgeben

Innerhalb der runden Klammern kann man nach der Zeichenkette und einem Komma einen weiteren Parameter angeben, über den man nacheinander die Zeichen vorgeben kann, die entfernt werden sollen. Hierbei muss die Reihenfolge der Zeichen nicht dem Muster entsprechen, das am Anfang und Ende der Zeichenkette vorliegt. Die Entfernung kann daher mehrere Schritte umfassen, sodass im Endeffekt alle zu entfernenden Zeichen aus der Zeichenkette entfernt werden.

Es wird geprüft, ob ein Zeichen, das entfernt werden soll, am Anfang oder Ende der Zeichenkette vorliegt. Trifft das zu, wird es entfernt, sodass das Ergebnis eine Zeichenkette mit einem anderen Zeichen am Anfang oder Ende ist. Danach erfolgt eine erneute Prüfung und ggf. eine Entfernung eines Zeichens. Dieser Vorgang wird solange wiederholt, bis der Anfang oder Ende der Zeichenkette keine zu entfernende Zeichen mehr enthält.

Beim folgenden Beispiel sind die zu entfernenden whitespaces manuell als Parameter vorgegeben worden. Die Entfernung der Zeichen verläuft dabei vereinfacht dargestellt in folgenden Schritten, sodass am Ende nur der Text Zeichenkette übrig bleibt.

  • \x0B am Ende entfernen
  • Leerzeichen am Anfang und Ende entfernen
  • \0 am Ende entfernen
  • Leerzeichen am Ende entfernen
  • \r am Ende entfernen
  • Leerzeichen am Ende entfernen
  • \n am Ende entfernen
  • Leerzeichen am Ende entfernen
  • \t am Ende entfernen
  • Leerzeichen am Ende entfernen
<?php

$str = " Zeichenkette \t \n \r \0 \x0B";

echo trim($str, "\0\t\x0B \r\n") . '<br>';

?>

Den Unterschied kann man feststellen, wenn man zu Beginn und am Ende der Zeichenkette ein Zeichen setzt, das nicht zu den zu entfernenden Zeichen zählt. In dem Fall werden keine Zeichen entfernt. Beim folgenden Beispiel wurde die Zeichenkette links und rechts um ein Bindestrich erweitert. Da der Bindestrich nicht zu den zu entfernenden Zeichen zählt, werden keine Zeichen entfernt und die Funktion trim() hat im Grunde keine Auswirkung auf die Zeichenkette.

<?php

$str = "- Zeichenkette \t \n \r \0 \x0B-";

echo trim($str, "\0\t\x0B \r\n") . '<br>';

?>

Es ist mit trim() natürlich nicht nur möglich, whitespaces zu entfernen. Man kann auch andere Ziffern, Buchstaben oder Sonderzeichen als Parameter angeben, die entfernt werden sollen. Beim folgenden Beispiel bleibt nach der Bearbeitung mit trim() die Zeichenkette DEFGHIQRSTUV übrig, da die Zeichen CBA2189ZYX im Laufe der Bearbeitung entfernt werden.

<?php

$str = "12ABCDEFGHIQRSTUVXYZ89";

// Ausgabe DEFGHIQRSTUV
echo trim($str, "CBA2189ZYX") . '<br>';

?>

Die Funktion trim() verarbeitet Zeichenketten case-sensitive, sodass zwischen Groß- und Kleinschreibung unterschieden wird. Beim folgenden Beispiel werden keine Zeichen entfernt, da die zu entfernenden Zeichen in Kleinbuchstaben angegeben wurden.

<?php

$str = "ABCXYZ";

// Ausgabe ABCXYZ
echo trim($str, "abyz") . '<br>';

?>

Bei normalen Zeichen (inkl. Leerzeichen) kann man die Zeichenkette und den Parameter in einfachen Hochkommas setzen.

<?php

$str = ' ABCXYZ ';

// Ausgabe BCXY
echo trim($str, ' AZ') . '<br>';

?>

Enthält die Zeichenkette dagegen whitespaces wie \t, \n, \r, \0 oder \x0B, muss man diese in normalen Anführungszeichen setzen, da sie sonst keine Auswirkung haben. Möchte man diese mit trim() entfernen, muss man den Parameter mit den zu entfernenden whitespaces ebenfalls in normalen Anführungszeichen setzen.

<?php

$str = "ABCXYZ\t\n";

// Ausgabe ABCXYZ
echo trim($str, "\t\n") . '<br>';

?>

Mit ... einen Bereich als Parameter angeben

Wenn man viele Zeichen entfernen und dabei nicht jedes einzelne Zeichen angeben möchte, so gibt es die Möglichkeit mit drei Punkten ... einen Bereich anzugeben. Hierbei orientiert sich PHP an der Position im Zeichensatz. Wenn man z.B. angibt, dass bis zum Buchstaben C alle Zeichen entfernt werden sollen, so beginnt PHP nicht mit dem Buchstaben A, sondern mit dem Nullzeichen des ASCII-Zeichensatzes und entfernt alle Zeichen bis zum Buchstaben C. Das sorgt dafür, dass z.B. auch Ziffern entfernt werden, da die Ziffern im ASCII-Zeichensatz vor dem Buchstaben C angeordnet sind.

<?php

$str = "0123456789ABCXYZ0123456789";

// Ausgabe XYZ
echo trim($str, "...C") . '<br>';

?>

Mit zwei Punkten .. kann man einen speziellen Bereich angeben, so dass nicht alle Zeichen ab dem Bye 0 (Nullzeichen) entfernt werden. Beim folgenden Beispiel ist der Bereich für die Zeichen 7 bis 9 angegeben worden. Das bewirkt, dass lediglich die Ziffern 7-9 im rechten Teil der Zeichenkette entfernt werden.

<?php

$str = "0123456789ABCXYZ0123456789";

// Ausgabe 0123456789ABCXYZ0123456
echo trim($str, "7..9") . '<br>';

?>

Parameter über hexadezimalen ASCII-Wert angeben

Einzelne Zeichen oder einen Bereich kann man auch über den hexadezimalen Wert angeben. Das kann insbesondere bei whitespaces oder Sonderzeichen wie z.B. dem Anführungszeichen nützlich sein. Hierfür wird dem Wert ein \x vorangestellt. Der hexadezimale ASCII-Wert für das Zeichen 7 ist 37 und der für 9 ist 39. Um den Bereich für 7 - 9 über den hex. ASCII-Wert anzugeben, schreibt man als Parameter somit \x37..\x39. Nachfolgend ist ein Code mit einigen Beispielen.

<?php

$str = "0123456789ABCXYZ0123456789";

// Bereich ab Nullzeichen bis Ziffer 9
// Ausgabe ABCXYZ
echo trim($str, "...\x39") . '<br>';

// Bereich zwischen Ziffer 7 - 9
// Ausgabe 0123456789ABCXYZ0123456
echo trim($str, "\x37..\x39") . '<br>';

// Einzelne Zeichen 0, 1 und 2
// Ausgabe 3456789ABCXYZ0123456789
echo trim($str, "\x30\x31\x32") . '<br>';

?>

Mit trim() berücksichtigt PHP bei der Entfernung von Zeichen beide Seiten einer Zeichenkette. Mit ltrim() und rtrim() ist es möglich, die Entfernung nur auf eine Seite der Zeichenkette anzuwenden. Diese arbeiten wie trim(), nur mit dem Unterschied, dass mit ltrim() die Zeichen auf der linken Seite und mit rtrim() auf der rechten Seite einer Zeichenkette entfernt werden.