öffentlich
Redaktion Druckversion

PHP lernen (1): Einführung, Installation und erste Schritte

Zeichenkettenverarbeitung

Sie haben inzwischen schon einige PHP-Funktionen kennen gelernt: gettype() um den Datentypen einer Variablen auszulesen, round() um Zahlen zu runden, number_format() um Zahlen zu formatieren und nl2br() um ASCII-Zeilenumbrüche in HTML-Zeilenumbrüche umzuwandeln.

In diesem Abschnitt erläutere ich Ihnen ausführlich die Anwendung der zahlreichen PHP-Funktionen und den Umgang mit der Dokumentation für PHP. In jedem Ihrer Programme werden Sie eine Vielzahl von PHP-Funktionen verwenden. Dabei handelt es sich um vordefinierte Funktionen, die eine bestimmte Aktion ausführen. In der Regel erwarten diese Funktionen Übergabeparameter, die in Klammern hinter den Funktionsnamen geschrieben werden. Mit den Werten dieser Übergabeparameter "macht" die Funktion dann etwas. Was sie genau "macht", wird im Handbuch beschrieben. Dort finden Sie auch die genaue Syntax einer Funktion. Wenn Sie sich nicht korrekt an die geforderte Syntax halten, wird Ihr Skript entweder eine Fehlermeldung produzieren oder nicht wie erwartet funktionieren.

Für die Verwendung von PHP-Funktionen werden Sie sehr oft das Manual heranziehen. Das gibt es auch in deutscher Übersetzung u. a. bei http://www.php.net/manual/de. Hier finden Sie auch nützliche Benutzerkommentare zu den einzelnen Funktionsbeschreibungen. Wenn Sie nicht immer online arbeiten wollen, laden Sie sich eine aktuelle Version auf Ihren Rechner herunter. Dokumentation zum Download finden Sie unter http://www.php.net/download-docs.php. Denken Sie daran, Ihre Offline-Version von Zeit zu Zeit zu aktualisieren.

Aus dem riesigen Funktionsumfang von PHP greifen wir zunächst die SCLXI. String-Funktionen, die Zeichenkettenfunktionen, heraus. Werfen Sie nun einen Blick in die Dokumentation der Zeichenkettenfunktionen von PHP. Öffnen Sie im deutschen Handbuch das Kapitel String-Funktionen in einem Extrafenster oder einem Extratabulator Ihres Browsers. Hier finden Sie eine Übersicht aller vordefinierten Zeichenketten-Funktionen, über die PHP verfügt. Sie sehen hier eine Übersicht mit kurzen Erläuterungen, was die Funktion tut. Wenn Sie nicht sicher sind, ob die Funktion die Aufgabe erfüllt, die Sie gerade brauchen, dann klicken Sie auf den Funktionsnamen, um eine genauere Beschreibung zu finden.

Benutzerkommentare

Übrigens: In der Online-Version des Handbuchs auf php.net stehen unter den einzelnen Funktionsbeschreibungen englischsprachige Benutzerkommentare. Hier finden sich häufig sehr nützliche ergänzende Hinweise zur Anwendung und zum Verhalten einer Funktion. Es lohnt sich, hier einmal stöbern zu gehen, wenn Sie an einem Problem knabbern.

Wir besprechen nun die Anwendung der PHP-Funktionen anhand einiger Beispiele.

Parameter und Rückgabewerte

Als Erstes betrachten wir die Funktion strtr(). Die Funktion durchläuft eine Zeichenkette, tauscht dabei bestimmte Zeichen aus und gibt die veränderte Zeichenkette zurück. Die Syntax hierfür lautet laut Handbuch:

string strtr (string str, string from, string to)

Als Erstes wird der Datentyp des Rückgabewertes bestimmt. Der Rückgabewert ist sozusagen das Ergebnis der Funktion. Da hier eine Zeichenkette verändert wird, ist der Rückgabewert der Funktion ebenfalls vom Typ string, der Rückgabewert ist also eine Zeichenkette.

Dann folgt der Name der Funktion strtr und in den runden Klammern stehen die Parameter der Funktion, jeweils mit ihrem Datentypen. Die Parameter werden durch Kommata getrennt. Diese Funktion fordert also drei Parameter: Der erste Parameter (hier: string str) enthält die Zeichenkette, die verändert werden soll. Der zweite (hier: string from) das oder die Zeichen, nach denen gesucht werden soll, und der dritte (hier: string to) das oder die Zeichen, die stattdessen eingesetzt werden sollen. Das bedeutet, wenn Sie diese Funktion benutzen wollen, müssen in den Klammern drei Zeichenketten stehen. Diese Parameter werden auch Übergabeparameter genannt.

Wenn Ihnen nun nicht gleich klar ist, was Übergabe- und Rückgabewerte sind: macht nichts, das besprechen wir später noch ausführlicher. Konzentrieren Sie sich zunächst darauf, zu beobachten, was passiert und ein Gefühl dafür zu entwickeln, wie solche Funktionen angewendet werden.

Schauen wir nun am besten an einem Beispiel, wie diese Funktion angewendet wird:

<?php
$test = "Hand"; 
$ausgetauscht = strtr ($test, "a", "u"); 
print $ausgetauscht;      // gibt Hund aus 
?>

Zunächst weisen wir der Variablen $test den Wert Hand zu. Anschließend rufen wir die Funktion strtr() auf und tauschen in dieser Variablen den Buchstaben a durch u aus. Der Rückgabewert der Funktion wird in der Variablen $ausgetauscht gespeichert. In der dritten Zeile wird diese Variable ausgegeben.

Der Rückgabewert dieser Funktion ist die bearbeitete Zeichenkette. Nur durch diesen Rückgabewert können Sie auf die veränderte Zeichenkette zugreifen. Dafür muss, wie hier in Zeile 2, der Funktionsaufruf einer Variablen gleichgesetzt werden. In dieser Variablen wird der Rückgabewert gespeichert. Der alleinige Aufruf einer Funktion bewirkt hier nichts. Um auf das Ergebnis einer Funktion zugreifen zu können, wird ein Rückgabewert definiert. Was genau der Rückgabewert einer Funktion enthält, steht jeweils im Manual. Nicht jede Funktion muss einen Rückgabewert enthalten.

Ersetzt werden übrigens alle Vorkommen von from in to, aus "Handtasche" würde also "Hundtusche" werden. Wenn das gesuchte Zeichen nicht vorhanden ist, wird die Zeichenkette unverändert zurückgegeben.

Sie können den Rückgabewert auch direkt ausgeben, ohne ihn in einer Variablen zwischen zu speichern:

<?php
$test = "Hottentotten"; 
print strtr ($test, "o", "a");    // gibt Hattentatten aus
?>

Und Sie können auch die Zeichenkette direkt in den Funktionsaufruf schreiben, ohne sie vorher in einer Variablen zu speichern:

<?php
print strtr ("Handtasche", "a", "u");   // gibt Hundtusche aus 
?>

Wenn Sie diese Funktion einsetzen, müssen Sie unbedingt beachten, dass die Anzahl der Zeichen des 2. und 3. Parameters gleich sein muss. Nehmen wir einmal ein praktisches Beispiel: Sie wollen bei einem Dateiupload den ursprünglichen Dateinamen auf dem Server beibehalten. Sie müssen also sicherstellen, dass dieser vom Anwender frei vergebene Dateiname keine unerlaubten Sonderzeichen enthält, also auch keine Umlaute, damit Links in Unix-Systemen auch funktionieren. Diese Umlaute wollen Sie mittels der besprochenen Funktion austauschen.

<?php
$datei = "Lösungsvorschläge.pdf"; 
$neue_datei = strtr ($datei, "ö", "oe"); 
$neue_datei = strtr ($neue_datei, "ä", "ae");
$neue_datei = strtr ($neue_datei, "ü", "ue");
print $neue_datei;      // gibt Losungsvorschlage.pdf aus
?>

So etwas würde in einer Schleife besser aussehen, aber das kommt erst in "PHP lernen (2)" ...

Die Ausgabe ist nun keineswegs, was wir erwartet haben. Es sollte eben oe statt ö da stehen und nicht nur das o, Loesungsvoerschlaege.pdf statt Losungsvorschlage.pdf. Wie gesagt, die Anzahl der Zeichen muss bei dieser Funktion übereinstimmen. Wir brauchen also eine andere Funktion und versuchen es einmal mit ereg_replace().

string ereg_replace (string Suchmuster, string Ersatz, string Zeichenkette)

Diese Funktion sucht nach genau der im Suchmuster beschriebenen Zeichenkette und ersetzt diese durch genau die im 2. Parameter gesetzte Zeichenkette, und zwar unabhängig von der Zeichenanzahl. Beachten Sie die geänderte Reihenfolge der Parameter!

<?php
$datei = "Lösungsvorschläge.pdf"; 
$neue_datei = ereg_replace ("ö", "oe", $datei);
$neue_datei = ereg_replace ("ä", "ae", $neue_datei);
$neue_datei = ereg_replace ("ü", "ue", $neue_datei);
print $neue_datei;      // gibt Loesungsvorschlaege.pdf aus
?>

Dieses Beispiel tut nun, was wir wollten und wandelt tatsächlich die Umlaute wie ö in oe usw. um.

Eine weitere Zeichenkettenfunktion:

string strtolower (string string)

Der Rückgabewert ist hier wieder der veränderte String. Die Funktion strtolower() setzt alle Buchstaben des Strings in Kleinbuchstaben. Damit können Sie nun auch sicherstellen, dass der neue Dateiname einheitlich Kleinbuchstaben enthält:

<?php
$datei = "LOESUNGSVORSCHLAEGE.PDF"; 
print strtolower ($datei);  // gibt loesungsvorschlaege.pdf aus
?>

Wenn Sie nun aber das erste Zeichen doch als Großbuchstaben haben wollen, dann benutzen Sie einfach:

string ucfirst (string string)

<?php
$datei = "loesungsvorschlaege.pdf"; 
print ucfirst ($datei);  // gibt Loesungsvorschlaege.pdf aus
?>

Natürlich sind Rückgabewerte und Parameter nicht immer vom Datentypen string. Ein Beispiel mit einem integer ist die Funktion str_repeat(), mit der Sie zum Beispiel Trennlinien generieren können.

string str_repeat (string input, int multiplier)

Die Funktion erwartet zwei Parameter: Der erste Parameter enthält die Zeichenkette, die wiederholt werden soll, der zweite Parameter den Faktor, wie oft die Zeichenkette wiederholt werden soll.

<?php
print str_repeat("~", 10);    // Ausgabe: ~~~~~~~~~~
print str_repeat("0", 10);    // Ausgabe: 0000000000
print str_repeat("abc", 3);   // Ausgabe: abcabcabc
?>

Optionale Parameter und Konstanten

Häufig werden Sie im Manual auf Parameter von Funktionen stoßen, die in eckigen Klammern stehen. Das sind optionale Parameter. Sie können also weggelassen werden. Einige Parameter wiederum sind als Konstanten definiert und dürfen nur bestimmte Werte haben. Konstanten sind immer in Großbuchstaben gesetzt. Die erlaubten Werte der Konstanten werden im Handbuch beschrieben. Wichtig ist, dass die Funktion nur mit genau den definierten Konstanten arbeiten kann. Schauen wir uns dazu die Funktion htmlentities() an. Sie wandelt Sonderzeichen in die entsprechenden HTML-Escape-Zeichen um, also z.B. ö in &ouml; und ist im Zusammenhang mit Formularen und der Ausgabe von Benutzereingaben nützlich. Sie werden das in Teil 3 sehen.

string htmlentities (string string [,int quote_style ])

Der zweite Parameter steht in eckigen Klammern und ist optional. Sie können die Funktion also auch mit nur einem Parameter aufrufen, der die umzuwandelnde Zeichenkette enthält. Rückgabewert der Funktion ist die manipulierte Zeichenkette. Der optionale zweite Parameter steuert die Behandlung von einfachen bzw. doppelten Anführungszeichen. Für quote_style gibt es nur drei mögliche Angaben: Im Modus ENT_COMPAT werden nur die doppelten, im Modus ENT_QUOTES beide Arten und im Modus ENT_NOQUOTES gar keine Anführungszeichen umgewandelt. Wenn Sie die Funktion mit nur einem Parameter aufrufen, wird automatisch der Wert ENT_COMPAT für die doppelten Anführungszeichen gesetzt.

Beachten Sie, dass die doppelten Anführungsstriche mit einem Backslash \ maskiert sind. Fehlt der Backslash, interpretiert PHP das zweite Anführungszeichen als Ende der Zeichenkette und weiß mit dem Rest der Zeile nichts rechtes mehr anzufangen. Es wird ein Fehler ausgegeben.

$sonderzeichen = "'einfache' und \"mehrfache\" Gänsefüßchen."; 
$sonderzeichen = htmlentities ($sonderzeichen); 
print "Umwandlung im Quelltext sichtbar: <br>\n";
print $sonderzeichen; 

/* 
Ausgabe im Quelltext: 
Umwandlung im Quelltext sichtbar: 
'einfache' und &quot;mehrfache&quot; G&auml;nsef&uuml;&szlig;chen.
*/

Probieren Sie das Beispiel mit allen Konstanten aus und schauen Sie jeweils in den Quelltext Ihres Browsers:

$sonderzeichen_default = htmlentities ($sonderzeichen, ENT_COMPAT); 
$sonderzeichen_mit = htmlentities ($sonderzeichen, ENT_QUOTES); 
$sonderzeichen_ohne = htmlentities ($sonderzeichen, ENT_NOQUOTES); 

print "siehe Quelltext: $sonderzeichen_default <br>"; 
/* 
Ausgabe im Quelltext: 
 'einfache' und &quot;mehrfache&quot; G&auml;nsef&uuml;&szlig;chen.
*/

print "siehe Quelltext: $sonderzeichen_mit <br>"; 
/* 
Ausgabe im Quelltext: 
 &#039;einfache&#039; und &quot;mehrfache&quot; G&auml;nsef&uuml;&szlig;chen.
*/

print "siehe Quelltext: $sonderzeichen_ohne";
/* 
Ausgabe im Quelltext: 
 'einfache' und "mehrfache" G&auml;nsef&uuml;&szlig;chen.
*/

Je nachdem, welches Attribut für den zweiten Parameter gesetzt wurde, werden die einfachen Anführungszeichen durch &#039; und die doppelten durch &quot; ersetzt oder nicht.

Verschachteln von Funktionen

Wenn Sie nun Text aus einem mehrzeiligen Textfeld eines Formulars entgegennehmen und ausgeben wollen, müssen Sie zuerst die Entitäten umwandeln und darüber hinaus wollen Sie vielleicht auch die Zeilenumbrüche mit ausgeben, die der Benutzer in das Textfeld gesetzt hat. Sie wollen also 2 PHP-Funktionen auf die Zeichenkette anwenden. Wenn Sie mehrere Funktionen hintereinander anwenden wollen, können Sie diese Funktionen nacheinander aufrufen und den jeweiligen Rückgabewert in einer Variablen speichern:

$mehrzeilig = "Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König";

$sonderzeichen = htmlentities ($mehrzeilig);
$umbrueche = nl2br($sonderzeichen);
print $umbrueche;

/* Ausgabe:
Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König

Quelltext im Browser:
Sehr geehrte Damen und Herren!<br />
diese ist mein Kommentar. <br />
Viele Gr&uuml;&szlig;e<br />
Frau K&ouml;nig
*/

Die Rückgabewerte wurden hier in zwei unterschiedlichen Variablen zwischen gespeichert. Das ist nicht notwendig, Sie können auch den Wert der ursprünglichen Variablen jeweils überschreiben:

$mehrzeilig = "Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König";

$mehrzeilig = htmlentities ($mehrzeilig);
$mehrzeilig = nl2br($mehrzeilig);
print $mehrzeilig;

/* Ausgabe:
Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König

Quelltext im Browser:
Sehr geehrte Damen und Herren!<br />
diese ist mein Kommentar. <br />
Viele Gr&uuml;&szlig;e<br />
Frau K&ouml;nig
*/

Beide Varianten funktionieren gleich gut. Die 2. Variante ist insofern eleganter, als dass Sie nicht so viele Variablen initialisieren. Mit zu vielen Variablennamen entsteht eine Fehlerquelle. Sie brauchen für die Anwendung mehrerer Funktionen nur einen Variablennamen.

Genauso gut können Sie aber auch die Funktionen verschachteln. Beachten Sie dabei, dass die Funktionen von innen nach außen abgearbeitet werden. Hier wird also zuerst htmlentities() angewendet und dann nl2br():

$mehrzeilig = "Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König";

$mehrzeilig = nl2br (htmlentities ($mehrzeilig);
print $mehrzeilig;

/* Ausgabe:
Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König

Quelltext im Browser:
Sehr geehrte Damen und Herren!<br />
diese ist mein Kommentar. <br />
Viele Gr&uuml;&szlig;e<br />
Frau K&ouml;nig
*/

Die Reihenfolge ist wichtig, Würde Sie die Funktionen umgekehrt anwenden, würden zuerst die Zeilenumbrüche \n in <br />\n umgewandelt werden. Im 2. Schritt würden mit htmlentities() dann die spitzen Klammern in den breaks durch ihre Entitäten ersetzt und die Ausgabe wäre unbrauchbar:

$mehrzeilig = "Sehr geehrte Damen und Herren!
diese ist mein Kommentar.
Viele Grüße
Frau König";

$mehrzeilig = nl2br (htmlentities ($mehrzeilig);
print $mehrzeilig;

/* Ausgabe:
Sehr geehrte Damen und Herren! <br />
diese ist mein Kommentar. <br />
Viele Grüße<br />
Frau König

Quelltext im Browser:
Sehr geehrte Damen und Herren! <br /&gt;
diese ist mein Kommentar. <br /&gt;
Viele Gr&uuml;&szlig;e<br /&gt;
Frau K&ouml;nig
*/

Sie können prinzipiell beliebig viele Funktionen verschachteln. Das wird irgendwann unübersichtlich. Wenn Sie selbst nicht mehr verstehen, was Sie programmiert haben, dann gehen Sie lieber mehrere Zwischenschritte.

Achten Sie beim Verschachteln von mehreren Funktionen an die Reihenfolge der Funktionen. Sie werden immer von innen nach außen abgearbeitet.

Experimentieren Sie ruhig noch ein wenig herum. Zeichenkettenfunktionen gehören zu den wichtigsten in PHP. Sie gut zu kennen, vereinfacht die Suche nach der geeigneten Funktion im Programmieralltag und verkürzt im Zweifelsfall sogar Ihren Code.

Achten Sie bei den Funktionen mit einem halben Auge auch auf die Angabe der PHP-Version, ab der eine Funktion unterstützt wird. Diese Angabe steht im Handbuch direkt unter dem Funktionsnamen in runden Klammern. Wenn eine Funktion bei Ihnen lokal oder auf dem Zielserver nicht tut, was Sie erwarten, kann das eventuell an der jeweiligen PHP-Version liegen.

Natürlich gibt es bei den Funktionen auch Bugs. Es kommt schon mal vor, dass eine Funktion nun wirklich nicht das tut, was in der Dokumentation beschrieben wird. Wenn Sie ganz sicher sind, die Syntax korrekt angewendet zu haben, schauen Sie ruhig mal in den Bug-Report von php.net. Vielleicht handelt es sich um einen bekannten Bug oder ein bekanntes Missverständnis der Funktionalität. Seien Sie aber bitte zunächst zurückhaltend mit dem Anmelden eines neuen Bugs. Prüfen Sie gründlich, ob Sie die Funktion wirklich richtig anwenden oder ihr Verhalten nicht falsch einschätzen. Hierfür sind auch die englischsprachigen Benutzerkommentare in der Online-Version des offiziellen PHP-Handbuchs nützlich. Hier dokumentieren Programmierer, wie sich Funktionen in verschiedenen Zusammenhängen verhalten.

Mitglied werden, Vorteile nutzen!

  • Sie können alles lesen und herunterladen: Beiträge, PDF-Dateien und Zusatzdateien (Checklisten, Vorlagen, Musterbriefe, Excel-Rechner u.v.a.m.)
  • Unsere Autoren beantworten Ihre Fragen

Downloads zu diesem Beitrag

Newsletter abonnieren