PHP 5 Kochbuch

David Sklar

Adam Trachtenberg

Copyright © 2009 O’Reilly Verlag GmbH & Co. KG

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Kommentare und Fragen können Sie gerne an uns richten:

Copyright der deutschen Ausgabe:

1. Auflage 2003
2. Auflage 2005
3. Auflage 2009

Die 2. Auflage der Originalausgabe erschien 2006 unter dem Titel PHP Cookbook, 2nd Edition im Verlag O’Reilly Media, Inc.

Die Darstellung eines Galapagos-Landleguans im Zusammenhang mit dem Thema PHP ist ein Warenzeichen von O’Reilly Media, Inc.

Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.

Deutsche Übersetzung: Lars Schulten, Köln
Lektorat: Alexandra Follenius, Köln
Korrektorat: Sibylle Feldmann, Düsseldorf
Fachgutachten: Frank Kleine, Karlsruhe & Gerd Schaufelberger, Dresden
Satz: III-satz, Husby, www.drei-satz.de
Umschlaggestaltung: Michael Oreal, Köln
Produktion: Karin Driesen & Andrea Miß, Köln
Belichtung, Druck und buchbinderische Verarbeitung:
Druckerei Kösel, Krugzell; www.koeselbuch.de

Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.

O’Reilly VerlagBalthasarstr. 81 50670 Köln 0221/9731600 0221/9731608 kommentar@oreilly.de

Einleitung

PHP ist der Motor hinter Millionen von dynamischen Webanwendungen. Aufgrund seiner vielfältigen Möglichkeiten, seiner gut verständlichen Syntax und seiner Unterstützung für verschiedene Betriebssysteme und Webserver ist PHP zur idealen Sprache für schnelle Webentwicklungen wie auch für den methodischen Aufbau komplexer Systeme geworden.

Einer der Hauptgründe für den Erfolg von PHP als Web-Skriptsprache ist dessen Ursprung als Hilfsmittel zur Verarbeitung von HTML-Formularen und zur Erzeugung von Webseiten. PHP ist also sehr webfreundlich. Außerdem ist PHP polyglott – es kann mit einer Vielzahl von Datenbanken kommunizieren und kennt diverse Internetprotokolle. PHP erleichtert die Analyse von Browser-Daten und die Generierung von HTTP-Anfragen. Dieser webbezogene Fokus wirkt sich natürlich auch auf die Rezepte und Beispiele dieses PHP 5 Kochbuchs aus.

Das Buch ist eine Sammlung von Lösungen für gängige Aufgaben bei der Arbeit mit PHP. Wir haben uns bemüht, für alle Programmierer – vom Einsteiger bis zum Spezialisten – interessantes Material zusammenzutragen. Wenn wir damit Erfolg hatten, werden Sie einiges (oder vielleicht eine ganz Menge) aus dem PHP 5 Kochbuch lernen können. Hier gibt es Tipps für Programmierer, die jeden Tag mit PHP zu tun haben, und auch für Entwickler, die von einer anderen Programmiersprache zu PHP gewechselt sind.

PHP ist als Quellcode und in Binärform kostenlos unter http://www.php.net/ als Download erhältlich. Die PHP-Website enthält außerdem Installationsanleitungen, umfassende Dokumentationen sowie Verweise auf Online-Ressourcen, Benutzergruppen, Mailinglisten und weitere PHP-Ressourcen.

An wen sich dieses Buch richtet

Dieses Buch ist für Programmierer geschrieben, die mit PHP Probleme lösen müssen. Wenn Sie PHP noch gar nicht kennen, sollte es eher Ihr zweites PHP-Buch werden. Wenn Sie bereits mit PHP vertraut sind, können Sie mithilfe dieses Buchs spezielle Probleme überwinden und Ihre Fähigkeiten weiterentwickeln (zumindest was Ihre Programmieraktivitäten betrifft). Außerdem kann das PHP 5 Kochbuch Ihnen zeigen, wie Sie bestimmte Aufgaben mithilfe von PHP lösen, mit denen Sie in einer anderen Sprache bereits vertraut sind, zum Beispiel das Versenden von E-Mails oder die Entwicklung eines SOAP-Servers. Auch Programmierer, die Anwendungen von anderen Sprachen nach PHP konvertieren, werden in diesem Buch einen treuen Begleiter finden.

Deutsche Überarbeitung für PHP 5.3

Die deutsche Ausgabe des PHP Kochbuchs wurde 2005 von Ulrich Speidel und Stephan Schmidt komplett überarbeitet und aktualisiert. Diese 2. Auflage behandelte PHP 5.0.x und befasste sich auch bereits mit einigen Änderungen in der Version 5.1.

Die vorliegende 3. Auflage des PHP 5 Kochbuchs deckt alle wichtigen Neuerungen ab, die die Veröffentlichung von PHP 5.3 mit sich gebracht hat. Die PHP-Experten Matthias Brusdeylins und Carsten Lucke haben dafür alle Rezepte und Codebeispiele geprüft und wenn nötig umgeschrieben, und sie haben das Kochbuch um eine Reihe von neuen Rezepten ergänzt.

Diese Auflage befasst sich nun unter anderem mit den maßgeblichen Änderungen im Objektmodell von PHP 5.3, die sich im Zusammenhang mit der lang erwarteten Einführung von Namensräumen ergeben haben. Weitere Themen wie das Late Static Binding und die Möglichkeit zur Erstellung von Lambda-Funktionen und Closures werden ebenso behandelt wie kleinere Erweiterungen. Dazu gehören zum Beispiel die NOWDOC-Notation und auch neue magische Methoden wie __callStatic( ).

Mit PHP 5.3 wurden diverse neue PHP-Erweiterungen eingeführt. Diese Neuauflage bespricht viele davon, unter anderem den neuen MySQL Native Driver (mysqlnd) als performante Alternative zur MySQL Client Library (libmysql). Außerdem wird die neue PHAR-Erweiterung behandelt.

Eine Vielzahl von Rezepten ist überarbeitet worden, um maßgebliche Neuerungen in Erweiterungen wie der Standard PHP Library (SPL) und der Datumserweiterung ext/date zu reflektieren.

Die Neuerungen von PHP 5.3 bieten einen immensen Zugewinn an Funktionalität gegenüber PHP 5.2.x, und die Autoren können Ihnen das Upgraden auf die neue Version nur wärmstens empfehlen. Endlich müssen Sie die fehlende Namensraumunterstützung nicht mehr durch komplexe Klassennamen und Verzeichnisstrukturen kompensieren. Hilfreiche Hinweise für den Umstieg finden Sie unter http://php.net/migration53.

Aufbau dieses Buchs

Wir gehen nicht davon aus, dass Sie sich hinsetzen und dieses Buch von Anfang bis Ende durchlesen (obwohl wir uns freuen würden, wenn Sie es täten!). PHP-Programmierer sind ständig mit vielfältigen Herausforderungen in einem weiten Themenbereich konfrontiert. Greifen Sie zum PHP 5 Kochbuch, wenn Sie auf ein konkretes Problem stoßen. Jedes Rezept enthält eine in sich geschlossene Problemlösung, die Ihnen einen Anstoß zur Bewältigung Ihrer Aufgabe gibt. Wenn ein Rezept weitergehende Fragen aufwirft, enthält es Verweise auf diesbezügliche Rezepte sowie auf andere Online- und Offlineressourcen.

Manchmal kann es aber auch sinnvoll sein, ein ganzes Kapitel auf einmal zu lesen. Die Rezepte steigern sich in der Regel vom Einfachen zum Schwierigen, und Beispielprogramme am Ende vieler Kapitel stellen die Themen im Zusammenhang dar. Die Einführungen zu den Kapiteln bieten einen Überblick über ihren jeweiligen Inhalt, enthalten Hintergrundinformationen und weisen auf besonders interessante Rezepte hin.

Das Buch beginnt mit vier Kapiteln über grundlegende Datentypen:

Kapitel 1, behandelt Einzelheiten wie die Verarbeitung von Substrings oder Groß- und Kleinschreibung und zeigt, wie man Strings in kleinere Teile zerlegt und kommaseparierte Daten analysiert.

Kapitel 2, erläutert Operationen mit Fließkomma- und Zufallszahlen, die Konvertierung zwischen verschiedenen Zahlensystemem sowie die Formatierung von Zahlen.

Kapitel 3, zeigt Ihnen, wie Sie Datums- und Zeitwerte manipulieren und formatieren, mit Zeitzonen und der Sommerzeit umgehen und die Zeit auf Mikrosekunden genau bestimmen.

Kapitel 4, behandelt Array-Operationen wie das Abarbeiten in Schleifen, das Vermischen sowie das Ändern, Entfernen und Extrahieren einzelner Elemente.

Danach folgen Kapitel zu den Elementen, aus denen Programme zusammengesetzt werden, sowie zu einigen Themenbereichen, die in PHP 5 neu hinzugekommen sind:

Kapitel 5, behandelt bemerkenswerte Eigenheiten von PHP bezüglich des Umgangs mit Variablen, darunter Vorgabewerte, statische Variablen und die Umwandlung von komplexen Datentypen in eine String-Repräsentation.

Bei den Rezepten in Kapitel 6 geht es um die Verwendung von Funktionen in PHP: die Verarbeitung von Argumenten, die Über- und Rückgabe von Variablen als Referenzen, die Erzeugung von Funktionen zur Laufzeit, Lambda-Funktionen und Closures sowie die Bestimmung der Geltungsbereiche von Variablen.

Kapitel 7, behandelt das Objektmodell von PHP 5. Hier gibt es Rezepte zu Namensräumen, zur Anwendung des Überladens und des Polymorphismus, zur Definition von Konstruktoren und zum Kopieren von Objekten.

Kapitel 8, beschreibt die Anwendung von vier neuen nützlichen Konzepten in PHP 5: Iteratoren, mit denen Sie Objekte einfach in einer foreach-Schleife bearbeiten können; Streams, mit denen Sie auf beliebige Datenquellen so zugreifen können wie auf eine Datei; Wrapper, mit denen Sie Datenquellen für die Stream-Funktionen vorbereiten können, und Filter, mit denen Sie Daten, die Sie in Streams schreiben oder aus ihnen auslesen, transparent modifizieren können.

Kapitel 9, zeigt Ihnen, wie Sie Ihre Anwendungen durch den Einsatz von Ausnahmen (Exceptions) robuster gestalten und Code zur Fehlerbehandlung von anderem Code trennen.

Die folgenden sechs Kapitel widmen sich Themen rund um die klassische Webprogrammierung:

Kapitel 10, behandelt Cookies, Header, Authentifizierung, Konfigurationsvariablen und weitere Grundlagen von Webanwendungen.

Kapitel 11, zeigt, wie man Eingaben validiert, mit mehrseitigen Formularen arbeitet, Formulare mit Fehlermeldungen anzeigt und mit Sonderzeichen in den Benutzerdaten umgeht.

Kapitel 12, erläutert die Unterschiede zwischen Textdateien, DBM- und SQL-Datenbanken und geht auf den neuen MySQL Native Driver (mysqlnd) ein. Außerdem zeigt es, wie man mithilfe der Datenbank-Abstraktionsschicht PHP Data Objects (PDO) eindeutige Kennzeichen zuweist, Zeilen wiederfindet, Daten verändert, Anführungszeichen setzt und Debugging-Informationen protokolliert.

Kapitel 13, hat das Auslesen von URLs und die Verarbeitung von HTML-Code zum Schwerpunkt, behandelt aber auch den Gebrauch von Templates und zeigt, wie man Server-Zugriffsprotokolle analysiert.

Kapitel 14 behandelt XML und die verschiedenen APIs, mit denen XML verarbeitet werden kann, wie DOM, SAX, XSLT sowie die PECL-Extensions xmlWriter und xmlReader oder auch die nur in PHP 5 verfügbare Erweiterung simpleXML. Weiterhin erfahren Sie, wie Sie wiederkehrende Arbeiten mithilfe von PEAR-Paketen vereinfachen.

Kapitel 15, befasst sich mit den Webservice-Standards XML-RPC, SOAP und RSS-Feeds. Außerdem zeigt es, wie Sie mit REST-Webservices umgehen.

Im darauffolgenden Buchabschnitt finden Sie eine Reihe von Kapiteln über weitere PHP-Features sowie über Erweiterungen, die viele nützliche Funktionalitäten bieten. Diese Rezepte helfen Ihnen beim Aufbau von Anwendungen, die unübertroffen robust, sicher, benutzerfreundlich und effizient sind.

Kapitel 16 behandelt reguläre Ausdrücke, mit deren Hilfe beispielsweise die Gültigkeit von E-Mail-Adressen geprüft und der Inhalt von HTML-Tags gelesen werden kann, sowie von »gierigem« und »nicht-gierigem« Matching.

In Kapitel 17, geht es um Verschlüsselung, unter anderem um das Generieren und Speichern von Passwörtern, den Austausch von verschlüsselten Daten mit anderen, die Speicherung von verschlüsselten Daten in einer Datei oder Datenbank und den Gebrauch von SSL.

Kapitel 18, zeigt Ihnen, wie Sie Grafiken erzeugen, indem Sie Text, Linien, geometrische Figuren und Kurven zeichnen.

Kapitel 19, hilft Ihnen dabei, Ihre Anwendungen weltweit benutzerfreundlich zu gestalten, und enthält Rezepte zur Verwendung von Locales sowie lokalisierten Texten, Datums- und Zeitwerten, Währungsbeträgen und Bildern.

Kapitel 20, erörtert netzwerkbezogene Aufgaben wie das Lesen und Versenden von E-Mails und Newsgroup-Beiträgen, den Gebrauch von FTP und LDAP und die Ausführung von DNS- und Whois-Abfragen.

Kapitel 21 und Kapitel 22 behandeln das Dateisystem:

Kapitel 21 konzentriert sich dabei auf den Umgang mit Dateien: wie man sie öffnet und schließt, temporäre Dateien benutzt, Dateien sperrt, komprimierte Dateien versendet und den Inhalt von Dateien verarbeitet.

Kapitel 22 behandelt Verzeichnisse und Datei-Metadaten; dieses Kapitel enthält Rezepte zur Veränderung der Zugriffsrechte und der Eigentümerschaft von Dateien, zum Verschieben und Löschen von Dateien und der Verarbeitung aller Dateien eines Verzeichnisses.

Den Abschluss bilden zwei Kapitel über Themen, mit denen die Möglichkeiten von PHP erweitert werden:

Kapitel 23, behandelt den Einsatz von PHP außerhalb der Webprogrammierung. Die Rezepte befassen sich mit Kommandozeilen-bezogenen Themen wie dem Parsen von Programmparametern und dem Einlesen von Passwörtern sowie mit der zeilenweisen Verarbeitung von Dateien, dem Forken von Prozessen oder der Programmierung eines Servers.

Kapitel 24 behandelt PEAR, das PHP Extension and Application Repository und die PHP Archiv-(PHAR-)Erweiterung. PEAR ist eine Sammlung von PHP-Programmen, die diverse Funktionen und PHP-Erweiterungen zur Verfügung stellt. PEAR-Module verwenden wir an verschiedenen Stellen im Buch, aber Kapitel 24 zeigt, wie Sie diese installieren und aktualisieren. Weitere Rezepte machen Sie mit Funktionen von PEAR vertraut, mit denen Sie unter anderem die PEAR-Infrastruktur für eigene Anwendungen nutzen können.

Weiterführende Quellen

Websites

Es gibt eine gewaltige Menge an online verfügbarem PHP-Referenzmaterial. Dort finden Sie alles, vom kommentierten PHP-Handbuch bis zu Sites mit regelmäßig erscheinenden Artikeln und Tutorials. Hier sind einige besonders wichtige Sites:

Das kommentierte PHP-Handbuch: http://www.php.net/manual/de

In 17 Sprachen verfügbar, enthält sowohl offizielle Dokumentationen der Funktionen und der Besonderheiten der Sprache als auch Kommentare von Anwendern.

PHP-Mailinglisten: http://www.php.net/mailing-lists.php

Es gibt viele PHP-Mailinglisten zur Installation, Programmierung und Erweiterung von PHP sowie zu verschiedenen anderen Themen. Eine Web-Oberfläche zum Lesen der Mailinglisten finden Sie unter http://news.php.net/.

PHP-Präsentationsarchiv: http://conf.php.net/

Eine Sammlung von Präsentationen zu PHP, die bei verschiedenen Konferenzen vorgeführt wurden.

PEAR: http://pear.php.net/

PEAR bezeichnet sich selbst als »ein Framework und Verteilungssystem für wiederverwendbare PHP-Komponenten«. Sie finden dort viele nützliche PHP-Klassen und Beispielprogramme.

PHP.net: A Tourist’s Guide: http://www.php.net/sites.php

Unter dem Dach von php.net ist dies ein »Reiseführer« zu verschiedenen Websites.

PHP Knowledge Base: http://php.faqts.com/

Viele Antworten und Fragen aus der PHP-Community und Links zu anderen Quellen.

PHP DevCenter: http://www.onlamp.com/php/

Eine Sammlung von PHP-Artikeln und Tutorials mit einer guten Mischung aus Einführung und fortgeschritteneren Themen.

Bücher

In diesem Abschnitt weisen wir Sie auf Bücher hin, die hilfreiche Referenzen und Tutorials für die Erstellung von PHP-Anwendungen bieten. Die meisten von ihnen behandeln speziell die Web-Programmierung; achten Sie auch auf Bücher über MySQL, HTML, XML und HTTP.

Programmieren mit PHP von Rasmus Lerdorf, Kevin Tatroe und Peter MacIntyre (O’Reilly Verlag)

PHP Design Patterns von Stephan Schmidt (O’Reilly Verlag)

HTML & XHTML – Das umfassende Handbuch von Chuck Musciano und Bill Kennedy (O’Reilly Verlag)

Dynamic HTML: The Definitive Reference von Danny Goodman (O’Reilly)

High Performance MySQL – Optimierung, Backups, Replikation und Lastverteilung von Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy Zawodny, Arjen Lentz, & Derek Balling (O’Reilly Verlag)

JavaScript – Das umfassende Referenzwerk von David Flanagan (O’Reilly Verlag)

CSS – Das umfassende Handbuch von Eric A. Meyer (O’Reilly Verlag)

Reguläre Ausdrücke von Jeffrey E. F. Friedl (O’Reilly Verlag)

XML in a Nutshell von Elliotte Rusty Harold und W. Scott Means (O’Reilly Verlag)

Vom Mythos des Mann-Monats. Essays zum Software-Engineering von Frederick P. Brooks (Mitp)

In diesem Buch verwendete Konventionen

Programmierkonventionen

Wir haben in der Regel die Anfangs- und Schlusskennzeichen <?php ?> bei den Beispielen in diesem Buch weggelassen, außer in den Beispielen, in denen die Kennzeichen im Programmrumpf enthalten sind. Um Namenskonflikte zu vermeiden, beginnen die Funktions- und Klassennamen im PHP 5 Kochbuch mit pc_.

Die Beispiele sind so geschrieben worden, dass sie unter der PHP-Version 5.3 laufen. Die Beispielprogramme sollten sowohl unter Unix als auch unter Windows funktionieren, sofern es nicht im Text anders vermerkt ist.

Schriftkonventionen

Folgende typographische Konventionen wurden in diesem Buch benutzt:

Kursiv

Für Datei- und Verzeichnisnamen, E-Mail-Adressen und URLs. Ebenso für neue Begriffe bei ihrer Definition.

Nichtproportionalschrift

Für Code-Listings und Schlüsselwörter, Variablen, Funktionen, Befehlsoptionen, Parameter, Klassennamen und HTML-Tags, wenn sie im Text auftauchen.

Nichtproportionalschrift fett

Für die Markierung von Zeilen in der Ausgabe der Code-Listings und Befehlszeilen, die der Benutzer schreibt.

Nichtproportionalschrift kursiv

Als genereller Platzhalter, um Elemente anzuzeigen, die durch aktuelle Werte in Ihrem eigenen Programm ersetzt werden müssen.

Die Codebeispiele zu diesem Buch

Es gibt eine Website von O’Reilly, auf der Sie Beispiele, Errata und weitere Informationen zu diesem Buch finden können:

http://www.oreilly.de/catalog/phpckbk3ger/

Viele der in diesem Buch abgedruckten Codebeispiele stehen dort zum Herunterladen zur Verfügung. Bitte klicken Sie auf den Beispiel-Link auf der Katalogseite zum Buch.

Die Codebeispiele verwenden

Dieses Buch ist dazu da, Ihnen bei Ihrer Arbeit zu helfen. In der Regel können Sie den Code dieses Buchs in Ihren Programmen und Dokumentationen verwenden. Sie brauchen uns nicht um Erlaubnis zu fragen, solange Sie nicht einen beachtlichen Teil des Codes wiedergeben. Beispielsweise benötigen Sie keine Erlaubnis, um ein Programm zu schreiben, das einige Codeteile aus diesem Buch verwendet. Für den Verkauf oder die Verbreitung einer CD-ROM mit Beispielen von O’Reilly-Büchern brauchen Sie auf jeden Fall unsere Erlaubnis. Die Beantwortung einer Frage durch das Zitieren dieses Buchs und seiner Codebeispiele benötigt wiederum keine Erlaubnis. Wenn Sie einen erheblichen Teil der Codebeispiele dieses Buchs in die Dokumentation Ihres Produkts einfügen, brauchen Sie eine Erlaubnis.

Wir freuen uns über einen Herkunftsnachweis, bestehen aber nicht darauf. Eine Referenz enthält i.d.R. Titel, Autor, Verlag und ISBN, zum Beispiel: »PHP 5 Kochbuch, 3. Auflage von David Sklar, Adam Trachtenberg, Carsten Lucke, Matthias Brusdeylins, Ulrich Speidel & Stephan Schmidt, Copyright 2009, O’Reilly Verlag, ISBN 978-3-89721-904-5.«

Wenn Sie meinen, Ihre Verwendung unserer Codebeispiele könnte den angemessenen Gebrauch oder die hier gegebene Erlaubnis überschreiten, nehmen Sie einfach mit uns über kommentar@oreilly.de Kontakt auf.

Kapitel 1. Strings

1.0 Einführung

Strings in PHP sind Zeichenfolgen wie etwa »Wir halten diese Wahrheiten für selbstverständlich« oder »Es war einmal« oder auch »111211211«. Wenn Sie Daten aus einer Datei lesen oder auf einem Webbrowser ausgeben, werden Ihre Daten durch Strings repräsentiert.

Auf individuelle Zeichen in Strings können Sie wie in C mit einer Schreibweise im Stil von Array-Indizes zugreifen. Das erste Zeichen in dem String hat den Index 0. Ein Beispiel:

$nachbar = 'Hilda';
print $nachbar[3];
d

PHP-Strings unterscheiden sich jedoch von C-Strings dadurch, dass sie binärsicher sind (d.h., sie können Null-Bytes enthalten) und auf Anweisung wachsen oder schrumpfen können. Ihre Größe ist nur durch den verfügbaren Speicherplatz beschränkt.

Sie können Strings auf vier Arten initialisieren, die in Form und Verhalten Perl und Unix-Shells ähneln: mit einfachen Anführungszeichen, mit doppelten Anführungszeichen, mit dem »Here-Document-Format« (Heredoc) und mit dem »Now-Document-Format« (Nowdoc). Bei Strings, die in einfachen Anführungszeichen stehen, müssen Sie nur ein Sonderzeichen in eine Escape-Sequenz umwanden, und zwar den Backslash, sowie auch das einfache Anführungszeichen selbst:

print 'Ich bin zum Kurfürstendamm gegangen.';
print 'Ich bin zum Ku\'damm gegangen.';
print 'Würden Sie $1.75 für 1/4 Liter Leitungswasser zahlen?';
print 'In Strings mit doppelten Anführungszeichen werden Zeilenwechel durch \n dargestellt';
Ich bin zum Kurfürstendamm gegangen.
Ich bin zum Ku'damm gegangen.
Würden Sie $1.75 für 1/4 Liter Leitungswasser zahlen?
In Strings mit doppelten Anführungszeichen werden Zeilenwechsel durch \n dargestellt.

Da PHP in Strings mit einfachen Anführungszeichen nicht nach zu interpolierenden Variablen und kaum nach Escape-Sequenzen sucht, kann man auf diese Weise Strings schnell und klar definieren.

In Strings mit doppelten Anführungszeichen werden keine einfachen Anführungszeichen in Form von Escape-Sequenzen erkannt, aber es werden interpolierte Variablen und die in Tabelle 1.1 aufgeführten Escape-Sequenzen erkannt.

Tabelle 1.1 Escape-Sequenzen in Strings mit doppelten Anführungszeichen

Escape-Sequenzen

Zeichen

\n

Zeilenwechsel (ASCII 10)

\r

Wagenrücklauf (ASCII 13)

\t

Tabulator (ASCII 9)

\\

Backslash

\$

Dollar-Zeichen

\”

Doppeltes Anführungszeichen

\{

Linke geschweifte Klammer

\}

Rechte geschweifte Klammer

\[

Linke eckige Klammer

\]

Rechte eckige Klammer

\0 bis \777

Oktalzahl

\x0 bis \xFF

Hexadezimalzahl

Zum Beispiel:

print "Ich bin zum Ku'damm gegangen.";
print "Die Soße kostet \$10.25.";
$preis = '$10.25';
print "Die Soße kostet $preis.";
print "Die Soße kostet \$\061\060.\x32\x35.";
Ich bin zum Ku'damm gegangen.
Die Soße kostet $10.25.
Die Soße kostet $10.25.
Die Soße kostet $10.25.

Die letzte Zeile des Codes gibt den Soßenpreis korrekt aus, denn das Zeichen 1 hat den ASCII-Code 49 (dezimal) oder 061 (oktal). Das Zeichen 0 ist ASCII 48 (dezimal) oder 060 (oktal), 2 ist ASCII 50 (dezimal) oder 32 (hexadezimal), und 5 ist ASCII 53 (dezimal) oder 35 (hexadezimal).

In den als Heredoc formatierten Strings werden die gleichen Interpolationen und Escape-Sequenzen wie in gewöhnlichen Strings mit doppelten Anführungszeichen erkannt. Lediglich die doppelten Anführungszeichen selbst müssen für die Ausgabe nicht mit einer Escape-Sequenz geschützt werden. Heredocs beginnen mit <<< und einem Token. Dieses Token (ohne umgebende Leerzeichen), gegebenenfalls gefolgt von einem Semikolon zum Abschließen der Anweisung, beendet das Heredoc. Ein Beispiel:

print <<< END
Es sieht seltsam aus, wenn auf Schildern Folgendes steht:
   Das Original "Root" Beer
   "Kostenloses" Geschenk
   Schuhe putzen, während "Sie" warten
oder wenn sie andere falsch gesetzte Anführungszeichen enthalten.
END;
Es sieht seltsam aus, wenn auf Schildern Folgendes steht:
   Das Original "Root" Beer
   "Kostenloses" Geschenk
   Schuhe putzen, während "Sie" warten
oder wenn sie andere falsch gesetzte Anführungszeichen enthalten.

Bei Heredocs bleiben Zeilenumbrüche, Leerzeichen und Anführungszeichen erhalten. Das Kennzeichen für das String-Ende wird normalerweise der Konvention entsprechend in Großbuchstaben geschrieben, wobei auf Groß- und Kleinschreibung geachtet werden muss. Deshalb ist Folgendes in Ordnung:

print <<< PETERSILIE
Leicht frisch anbauen können Sie:
- Petersilie
- Schnittlauch
auf Ihrer Fensterbank
PETERSILIE;

Ebenso dies:

print <<< HUNDE
Wenn Sie Haustiere mögen, schreien Sie:
HUNDE UND KATZEN SIND SUPER!
HUNDE;

Heredocs sind hilfreich, wenn man HTML mit eingefügten Variablen ausgeben möchte:

if ($uebrige_karten > 0) {
    $url = '/deal.php';
    $text = 'Mehr Karten austeilen';
} else {
    $url = '/new-game.php';
    $text = 'Neues Spiel beginnen';
}
print <<< HTML
Es sind <b>$uebrige_karten</b> &uuml;brig.
<p>
<a href="$url">$text</a>
HTML;

In diesem Fall muss das Semikolon hinter der Begrenzung für das String-Ende stehen, damit PHP weiß, dass die Anweisung beendet ist. Nehmen wir an, zwei Karten seien übrig, dann sieht die Ausgabe wie folgt aus:

Es sind <b>2</b> &uuml;brig.
<p>
<a href="/deal.php">Mehr Karten austeilen</a>

Manchmal dürfen Sie jedoch kein Semikolon benutzen:

$a = <<< END
Es war einmal ein
END
. ' Junge!';
print $a;
Es war einmal ein Junge!

In diesem Fall wird der Ausdruck in der folgenden Zeile fortgesetzt, deshalb benutzen Sie kein Semikolon. Beachten Sie auch, dass der Operator für die String-Verkettung in einer anderen Zeile stehen muss als das Kennzeichen für das String-Ende, damit PHP das Ende des Strings erkennen kann.

Seit PHP 5.3 existiert außerdem die Nowdoc-Syntax. Alle Regeln, die für Heredocs gelten, treffen auch auf Nowdocs zu. Der Unterschied ist, dass PHP in Nowdocs nicht nach zu interpolierenden Variablen und auch nach nur wenigen Sonderzeichen sucht. Als Faustregel kann man sagen, dass Nowdocs analog zu Strings mit einfachen Anführungszeichen funktionieren und Heredocs analog zu Strings mit doppelten Anführungszeichen. Nowdocs werden ebenfalls durch eine <<<-Sequenz eingeleitet, der nachfolgende Identifier wird aber in einfache Anführungszeichen eingeschlossen:

$uebrige_karten = 2;
if ($uebrige_karten > 0) {
    $url = '/deal.php';
    $text = 'Mehr Karten austeilen';
} else {
    $url = '/new-game.php';
    $text = 'Neues Spiel beginnen';
}
print <<< 'HTML'
Es sind <b>$uebrige_karten</b> &uuml;brig.
<p>
<a href="$url">$text</a>
HTML;
Es sind <b>$uebrige_karten</b> &uuml;brig.
<p>
<a href="$url">$text</a>

Wie Sie sehen, werden im Vergleich zum Heredoc-Beispiel die Variablen nicht durch ihre Werte ersetzt.

1.1 Auf Teil-Strings zugreifen

Sie möchten einen Teil eines Strings extrahieren und dabei an einer bestimmten Stelle im String beginnen. Beispielsweise benötigen Sie die ersten acht Buchstaben eines Benutzernamens, der in ein Formular eingeben worden ist.

Lösung

Benutzen Sie substr(), um Ihre Teil-Strings auszuschneiden:

$substring = substr($string,$start,$length);
$username = substr($_REQUEST['username'],0,8);

Diskussion

Wenn $start und $length positiv sind, gibt substr() die Anzahl von $length Zeichen aus dem String, beginnend mit $start, zurück. Das erste Zeichen im String ist an der Position 0:

print substr('Achte auf diesen Baum',6,5);
auf d

Wenn Sie $length weglassen, gibt substr() den String von $start bis zum Ende des ursprünglichen Strings zurück:

print substr('Achte auf diesen Baum',15);
n Baum

Wenn $start plus $length hinter dem String-Ende liegt, gibt substr() den gesamten String von $start an zurück:

print substr('Achte auf diesen Baum',28,5);
aum

Wenn $start negativ ist, zählt substr() rückwärts vom String-Ende, um festzustellen, wo der Teil-String beginnen soll:

print substr('Achte auf diesen Baum',-6);
print substr('Achte auf diesen Baum',-17,5);
n Baum
e auf

Wenn $length negativ ist, zählt substr() rückwärts vom String-Ende, um festzustellen, wo der Teil-String endet:

print substr('Achte auf diesen Baum',15,-2);
print substr('Achte auf diesen Baum',-4,-1);
n Ba
Bau

Siehe auch

Die Dokumentation zu substr() unter http://www.php.net/substr.

1.2 Teile von Strings ersetzen

Problem

Sie möchten einen Teil eines Strings durch einen anderen String ersetzen. Sie möchten beispielsweise alles außer den letzten vier Ziffern einer Kreditkartennummer vor der Ausgabe verbergen.

Lösung

Benutzen Sie substr_replace():

// Alles von der Position $start bis zum Ende von $alter_string
// wird durch $neuer_substring ersetzt.
$neuer_string = substr_replace($alter_String,$neuer_substring,$start);

// $laenge Zeichen, beginnend bei der Position $Start, werden durch
// $neuer_substring ersetzt.
$neuer_string = substr_replace($alter_string,$neuer_substring,$start,$laenge);

Diskussion

Ohne das Argument $length ersetzt substr_replace() alles von $start bis zum String-Ende. Wenn $length angegeben ist, wird nur die genannte Anzahl von Zeichen ersetzt:

print substr_replace('Mein Haustier ist ein blauer Hund.','Fisch.',22);
print substr_replace('Mein Haustier ist ein blauer Hund.','gelb',22,4);
$kreditkarte = '4111 1111 1111 1111';
print substr_replace($credit_card,'xxxx ',0,strlen($kreditkarte)-4);

Mein Haustier ist ein Fisch.
Mein Haustier ist ein gelber Hund.
xxxx 1111

Wenn $start negativ ist, wird der neue Teil-String bei $start-Zeichen, gezählt vom Ende von $alter_string und nicht vom Anfang, eingefügt:

print substr_replace('Mein Haustier ist ein blauer Hund.','Fisch.',-12);
print substr_replace('Mein Haustier ist ein blauer Hund.','gelb',-12,4);

Mein Haustier ist ein Fisch.
Mein Haustier ist ein gelber Hund.

Wenn $start und $laenge 0 sind, wird der neue Teil-String am Anfang von $alter_string eingefügt:

print substr_replace('Mein Haustier ist ein blauer Hund','Titel: ',0,0);

Titel: Mein Haustier ist ein blauer Hund.

Die Funktion substr_replace() ist nützlich, wenn Sie einen Text erhalten haben, der so umfangreich ist, dass man ihn nicht in einem Stück anzeigen kann, und Sie möchten einen Teil des Texts mit einem Verweis auf den übrigen Text anzeigen. Das folgende Beispiel zeigt die ersten 25 Zeichen einer Nachricht mit einer Ellipse an, auf die ein Link auf den weiteren Text folgt:

$r = mysql_query("SELECT id,message FROM messages WHERE id = $id") or die();
$ob = mysql_fetch_object($r);
printf('<a href="more-text.php?id=%d">%s</a>',
       $ob->id, substr_replace($ob->message,' ...',25));

Die Seite more-text.php kann mithilfe der im Query-String übergebenen Nachrichten-ID die vollständige Nachricht einlesen und anzeigen.

Siehe auch

Die Dokumentation zu substr_replace() unter http://www.php.net/substr-replace.

1.3 Einen String zeichenweise verarbeiten

Problem

Sie müssen alle Zeichen in einem String einzeln verarbeiten.

Lösung

Durchlaufen Sie jedes Zeichen des Strings mit for in einer Schleife. Dieses Beispiel zählt die Vokale in einem String:

$string = "An diesem Wochenende möchte ich ein zahmes Huhn kaufen.";
$vokale = 0;
for ($i = 0, $j = strlen($string); $i < $j; $i++) {
    if (strstr('aeiouäöüAEIOUÄÖÜ',$string[$i])) {
        $vokale++;
    }
}

Diskussion

Die zeichenweise Verarbeitung von Strings ermöglicht es, auf einfache Art und Weise Gleichniszahlen-Reihen zu berechnen:

Function lookandsay($s) {
    // Den Rückgabewert mit einem leeren String initialisieren.
    $r = '';
    /* $m enthält das Zeichen, das wir gerade zählen.
     * Mit dem ersten Zeichen im String initialisieren.*/
    $m = $s[0];
    // $n ist die Zahl der bereits gesehenen Zeichen in $m,
    // mit 1 initialisieren
    $n = 1;
    for ($i = 1, $j = strlen($s); $i < $j; $i++) {
        // Wenn dieses Zeichen dasselbe ist wie das letzte,
        if ($s[$i] == $m) {
            // den Zähler für dieses Zeichen erhöhen,
            $n++;
        } else {
            // andernfalls Zähler und Zeichen an Rückgabewert hängen.
            $r .= $n.$m;
            // Gesuchtes Zeichen auf aktuelles Zeichen setzen
            $m = $s[$i];
            // und den Zähler zurück auf 1 setzen.
            $n = 1;
        }
    }
    // Zusammengestellten String zusammen mit letztem Zähler
    // und letztem String zurückgeben.
    return $r.$n.$m;
}

for ($i = 0, $s = 1; $i < 10; $i++) {
    $s = lookandsay($s);
    print "$s\n";
}
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211

Gleichniszahlen-Reihen bezeichnet man auf Englisch auch als »Look and Say«-Sequenzen, weil jedes Element das darstellt, was man erhält, wenn man das vorhergehende Element betrachtet und sagt, was darin enthalten ist. Wenn Sie sich beispielsweise das erste Element mit der 1 anschauen, sagen Sie »eine Eins«. Also ist das zweite Element »11«. Das sind »zwei Einsen«, deshalb ist das dritte Element »21«. Auf die gleiche Art und Weise finden Sie hier »eine Zwei und eine Eins«, folglich ist das vierte Element »1211« und so weiter.

Siehe auch

Die Dokumentation zu for unter http://www.php.net/for; mehr über Gleichniszahlen-Reihen unter http://mathworld.wolfram.com/LookandSaySequence.html.

1.4 Einen String wort- oder zeichenweise umkehren

Problem

Sie möchten die Reihenfolge der Wörter oder Zeichen in einem String umkehren.

Lösung

Benutzen Sie strrev(), um in einem String die Zeichen umzukehren:

print strrev('Dies ist kein Palindrom.');

.mordnilaP niek tsi seiD

Um die Reihenfolge der Wörter umzukehren, müssen Sie den String an den Wortgrenzen in ein Array umwandeln, dann zunächst die Wörter umkehren und sie anschließend neu zusammenfügen:

$s = "Es war einmal eine Schildkröte.";
// Den String in seine Wörter aufbrechen.
$words = explode(' ',$s);
// Das Array der Wörter umkehren.
$words = array_reverse($words);
// Den String neu aufbauen.
$s = join(' ',$words);
print $s;

Schildkröte. eine einmal war Es

Diskussion

Wenn Sie die Wörter eines Strings umkehren möchten, können Sie auch alles in eine Zeile schreiben:

$reversed_s = join(' ',array_reverse(explode(' ',$s)));

Siehe auch

„21.7 Jedes Wort einer Datei verarbeiten“ behandelt die Folgen der Verwendung anderer Zeichen, die keine Leerzeichen sind, als Wortgrenzen; die Dokumentationen zu strrev() unter http://www.php.net/strrev und array_reverse() unter http://www.php.net/array-reverse.

1.5 Tabulatoren expandieren und komprimieren

Problem

Sie möchten Leerzeichen innerhalb eines Strings in Tabulator-Zeichen umwandeln (oder umgekehrt). Dabei soll der Text an den Tabstopps ausgerichtet bleiben. So möchten Sie beispielsweise Benutzern formatierten Text in standardisierter Form anzeigen.

Lösung

Verwenden Sie str_replace(), um Leerzeichen in Tabs oder Tabs in Leerzeichen umzuwandeln:

$r = mysql_query("SELECT message FROM messages WHERE id = 1") or die();
$ob = mysql_fetch_object($r);
$tabbed = str_replace(' ',"\t",$ob->message);
$spaced = str_replace("\t",' ',$ob->message);

print "mit Tabs: <pre>$tabbed</pre>";
print "mit Leerzeichen: <pre>$spaced</pre>";

Die Funktion str_replace() berücksichtig allerdings bei der Umwandlung keine Tabstopps. Wenn Sie nach jedem achten Zeichen einen Tabstopp haben möchten, muss in einer Zeile, die mit einem Wort mit fünf Zeichen und einem Tab beginnt, das Tab durch drei Leerzeichen ersetzt werden und nicht nur durch eins. Mithilfe der in Listing 1.1 dargestellten Funktion pc_tab_expand() können Sie Tabulator-Zeichen so in Leerzeichen umwandeln, dass Tabstopps berücksichtigt werden.

function pc_tab_expand($a) {
  $tab_stop = 8;
  while (strstr($a,"\t")) {
    $a = preg_replace('/^([^\t]*)(\t+)/e',
                      "'\\1'.str_repeat(' ',strlen('\\2') *
                       $tab_stop - strlen('\\1') % $tab_stop)",$a);
  }
  return $a;
}

$spaced = pc_tab_expand($ob->message);

Listing 1.1 pc_tab_expand()

Mit der Funktion pc_tab_unexpand() können Sie Leerzeichen in Tabs zurückverwandeln, wie Listing 1.2 zeigt.

function pc_tab_unexpand($x) {
  $tab_stop = 8;

  $lines = explode("\n",$x);
  for ($i = 0, $j = count($lines); $i < $j; $i++) {
    $lines[$i] = pc_tab_expand($lines[$i]);
    $e = preg_split("/(.\{$tab_stop})/",$lines[$i],-1,PREG_SPLIT_DELIM_CAPTURE);
    $lastbit = array_pop($e);
    if (!isset($lastbit)) { $lastbit = ''; }
    if ($lastbit == str_repeat(' ',$tab_stop)) { $lastbit = "\t"; }
    for ($m = 0, $n = count($e); $m < $n; $m++) {
      $e[$m] = preg_replace('/  +$',"\t",$e[$m]);
    }
    $lines[$i] = join('',$e).$lastbit;
  }
  $x = join("\n", $lines);
  return $x;
}

$tabbed = pc_tab_unexpand($ob->message);

Listing 1.2 pc_tab_unexpand()

Beide Funktionen nehmen einen String als Argument an und geben ihn entsprechend verändert zurück.

Diskussion

Beide Funktionen gehen davon aus, dass sich an jeder achten Stelle ein Tabstopp befindet; dies kann jedoch geändert werden, wenn man die Einstellung der Variablen $tab_stop anpasst.

Der reguläre Ausdruck in pc_tab_expand() sucht nach einer Gruppe von Tabs und zugleich auch den gesamten Text vor dieser Tab-Gruppe. Der Text vor der Tab-Gruppe muss mit einbezogen werden, weil die Länge dieses Texts bestimmt, durch wie viele Leerzeichen die Tabs ersetzt werden müssen, damit der anschließende Text mit dem nächsten Tabstopp übereinstimmt. Die Funktion ersetzt nicht einfach jeden Tab durch acht Leerzeichen, sondern richtet den Text hinter den Tab-Zeichen nach den Tabstopps aus.

Auf ähnliche Weise sucht auch pc_tab_unexpand() nicht einfach nach acht aufeinander folgenden Leerzeichen, um sie durch ein Tab-Zeichen zu ersetzen. Sie teilt jede Zeile in Einheiten von acht Zeichen und ersetzt dann Leerzeichen am Ende dieser Einheiten (wenn es mindestens zwei sind) durch Tabs. Dieses Vorgehen erhält nicht nur die Ausrichtung des Texts an den Tabstopps aufrecht, sondern spart auch Platz im String.

Siehe auch

Die Dokumentation zu str_replace() unter http://www.php.net/str-replace.

1.6 Die Groß- und Kleinschreibung in Texten ändern

Problem

Sie müssen Text in Großbuchstaben oder Kleinbuchstaben umwandeln oder die Schreibung von Buchstaben innerhalb eines Strings auf andere Weise verändern. Sie möchten beispielsweise die Anfangsbuchstaben von Namen groß-, den Rest aber kleinschreiben.

Lösung

Verwenden Sie ucfirst() oder ucwords(), um die Anfangsbuchstaben eines oder mehrerer Wörter großzuschreiben:

print ucfirst("wie geht es dir heute?");
print ucwords("the prince of wales");
Wie geht es dir heute?
The Prince Of Wales

Verwenden Sie strtolower() oder strtoupper(), um die Groß-/Kleinschreibung eines gesamten Strings zu verändern:

print strtoupper("ich schreie nicht!");
// Tags müssen kleingeschrieben werden, um XHTML-kompatibel zu sein.
print strtolower('<A HREF="eins.php">eins</A>');
ICH SCHREIE NICHT!
<a href="eins.php">eins</a>

Diskussion

Mithilfe von ucfirst() wandeln Sie das erste Zeichen eines Strings in einen Großbuchstaben um:

print ucfirst('affengesicht');
print ucfirst('1 affengesicht');
Affengesicht
1 affengesicht

Beachten Sie, dass die zweite Zeile nicht als »1 Affengesicht« ausgegeben wird. Seit PHP 5.3 existiert die Funktion lcfirst(), die das Gegenstück zu ucfirst() ist und somit den ersten Buchstaben einer Zeichenkette in einen Kleinbuchstaben umwandelt:

print lcfirst("SCHREI MICH NICHT AN!");
sCHREI MICH NICHT AN!

Mit ucwords() schalten Sie das erste Zeichen jedes Worts innerhalb eines Strings in Großbuchstaben um:

print ucwords('1 affengesicht');
print ucwords("war's frau schulze-schaumburg?");
1 Affengesicht
War's Frau Schulze-schaumburg?

Wie erwartet, schreibt ucwords() das »s« in »War’s« nicht groß. Aber die Funktion schreibt auch das »s« in »Schulze-schaumburg« nicht groß. Für ucwords() ist jede Abfolge von Zeichen ohne Leerzeichen ein Wort, wenn es auf ein oder mehrere Leerzeichen folgt. Da sowohl ' als auch - keine Leerzeichen sind, sieht ucwords() das »s« in beiden Fällen nicht als Anfangsbuchstaben eines Worts an.

Sowohl ucfirst() als auch ucwords() lassen die Groß-/Kleinschreibung aller nicht am Anfang stehenden Buchstaben unverändert:

print ucfirst('macWorld sagt, ich sollte ein iBook kaufen');
print ucwords('eTunaFish.com kauft itunaFish.Com!');
MacWorld sagt, ich sollte ein iBook kaufen
ETunaFish.com Kauft ItunaFish.Com!

Die Funktionen strtolower() und strtoupper() dagegen arbeiten mit den gesamten Strings und nicht mit nur einzelnen Zeichen. Alle Buchstaben des Alphabets werden durch strtolower() in Kleinbuchstaben umgewandelt, während strtoupper() aus allen Buchstaben Großbuchstaben macht:

print strtolower("Ich programmierte den WOPR und den TRS-80.");
print strtoupper('"since feeling is first" ist ein gedicht von e. e. cummings.');
ich programmierte den wopr und den trs-80.
"SINCE FEELING IS FIRST" IST EIN GEDICHT VON E. E. CUMMINGS.

Bei der Entscheidung darüber, was Groß- und was Kleinbuchstaben sind, beachten diese Funktionen Ihre Locale-Einstellungen.

Siehe auch

Weitere Informationen über Locale-Einstellungen finden Sie in Kapitel 19; die Dokumentationen zu ucfirst() unter http://www.php.net/ucfirst, ucwords() unter http://www.php.net/ucwords, strtolower() unter http://www.php.net/strtolower und strtoupper() unter http://www.php.net/strtoupper.

1.7 Funktionen und Ausdrücke in Strings interpolieren

Problem

Sie möchten das Ergebnis einer Funktion oder eines Ausdrucks in einen String einfügen.

Lösung

Verwenden Sie den Operator für die String-Verkettung (.), wenn der einzufügende Wert nicht direkt im String stehen kann:

print 'Sie haben '.($_REQUEST['Jungen'] + $_REQUEST['Mädchen']).' Kinder.';
print "Das Wort '$wort' ist ".strlen($wort).' Zeichen lang.';
print 'Sie schulden '.$betraege['Zahlung'].' sofort';
print "Der Kreisdurchmesser beträgt ".$circle->getDiameter().' Zentimeter.';

Diskussion

Variablen, Objekt-Eigenschaften und Array-Elemente können Sie in Strings mit doppelten Anführungszeichen direkt einfügen (sofern der Index nicht in Anführungszeichen steht):

print "Ich habe $kinder Kinder.";
print "Sie schulden $betraege[Zahlung] sofort.";
print "Der Kreisdurchmesser beträgt $circle->diameter Zentimeter.";

Die direkte Interpolation und die String-Verkettung lassen sich auch auf Heredocs anwenden. Die Interpolation durch verkettete Strings kann bei Heredocs etwas merkwürdig aussehen, da der Heredoc-Begrenzer und der Operator für die String-Verkettung in verschiedenen Zeilen stehen müssen:

print <<< END
Die Uhrzeit in diesem Moment ist
END
. strftime('%c') . <<< END
 und morgen ist es
END
. strftime('%c',time() + 86400);

Außerdem müssen Sie bei der Arbeit mit Heredocs darauf achten, dass Sie in den String an den richtigen Stellen Leerzeichen einfügen, damit der String insgesamt korrekt erscheint. Im vorhergehenden Beispiel muss sich nach »Die Uhrzeit in diesem Moment ist« am Zeilenende ein Leerzeichen befinden, und bei »und morgen ist es« muss ein Leerzeichen am Anfang und am Ende der Zeile stehen.

Siehe auch

Informationen zur Syntax für die Interpolation von Variablen (wie etwa ${"amount_$i"}) finden Sie in „5.4 Einen dynamischen Variablennamen erzeugen“; siehe außerdem die Dokumentationen zum Operator für die String-Verkettung unter http://www.php.net/language.operators.string.

1.8 Leerzeichen aus einem String entfernen

Problem

Sie möchten Leerzeichen am Anfang oder am Ende eines Strings entfernen. Sie möchten beispielsweise Benutzereingaben vor dem Validieren bereinigen.

Lösung

Verwenden Sie ltrim(), rtrim() oder trim(). ltrim() entfernt Leerraum vom String-Anfang, rtrim() vom String-Ende und trim() sowohl vom Anfang als auch vom Ende eines Strings:

$zipcode = trim($_REQUEST['plz']);
$no_linefeed = rtrim($_REQUEST['text']);
$name = ltrim($_REQUEST['name']);

Diskussion

Bei diesen Funktionen sind die folgenden Zeichen als Leerraum definiert: Zeilenvorschub, Wagenrücklauf, Leerzeichen, horizontaler und vertikaler Tab und Null.

Wenn Sie Leerraum abschneiden, sparen Sie Speicherplatz; außerdem kann beispielsweise die Anzeige formatierter Daten oder Texte innerhalb von <pre>-Tags präzisier erscheinen. Auch wenn Sie Benutzereingaben vergleichen, sollten Sie zuerst die Daten beschneiden, damit nicht jemand, der versehentlich »98052« als Zip-Code eingibt, einen Fehler korrigieren muss, der in Wirklichkeit keiner ist. Und vor einem exakten Textvergleich stellen Sie so auch sicher, dass beispielsweise »Salami\n« und »Salami« als gleich angesehen werden. Sinnvollerweise sollten Sie String-Daten vor dem Speichern in der Datenbank normalisieren, indem Sie die Leerzeichen entfernen.

Die trim()-Funktionen können auch benutzerspezifische Zeichen aus einem String entfernen. Sie übergeben die zu entfernenden Zeichen als zweites Argument. Einen Bereich von Zeichen können Sie dabei mit zwei Punkten zwischen dem ersten und dem letzten Zeichen der Gruppe angeben.

// Ziffern und Leerzeichen vom Zeilenanfang entfernen.
print ltrim('10 PRINT A$',' 0..9');
// Semikola von Zeilenende entfernen.
print rtrim('SELECT * FROM turtles;',';');
PRINT A$
SELECT * FROM turtles

PHP stellt auch chop() als Alias für rtrim() zur Verfügung. Sie sollten jedoch besser rtrim() verwenden, weil das chop() in PHP sich anders verhält als das chop() in Perl (das ohnehin zugunsten von chomp() als veraltet erklärt wurde) und die Verwendung dieser Funktion andere verwirren kann, die Ihre Programme lesen.

Siehe auch

Die Dokumentationen zu trim() unter http://www.php.net/trim, ltrim() unter http://www.php.net/ltrim und rtrim() unter http://www.php.net/rtrim.

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!