mit Stringmanipulationen werden Zeichenfolgen ausgewertet und verändert.
Funktion | Bedeutung |
---|---|
htmlspecialchars | Maskiert HTML Zeichen |
explode | Zerlegt eine Zeichenfolge in einzelne Teile, wobei sich die Aufteilung an bestimmten Zeichen orientiert, z.B. dem Leerzeichen. Die einzelnen Strings werden in einem Array abgelegt |
implode | Setzt die Werte eines Arrays, separiert durch ein Trennzeichen, zu einem String zusammen. |
trim | Entfernt führende und folgende Leerzeichen. |
ltrim | Entfernt führende Leerzeichen |
chop | Entfernt folgende Leerzeichen am rechten Ende |
sprintf | Formatiert Werte |
printf | Schreibt formatierte Werte |
strcasecmp | Vergleicht zwei Strings ohne Berücksichtigung von Groß- und Kleinschreibung. |
strchr | Suche in einem String nach einem Zeichen. |
strcmp | Vergleicht zwei Strings. |
mb_strlen | Ermittelt die Länge eines Strings / Multibyte Funktion |
mb_strpos | Ermittelt die Position eines Strings in einem anderen String. |
strstr | Sucht in einem anderen String nach einem String |
strtolower | Verwandelt die Buchstaben eines Strings in Kleinbuchstaben |
strtoupper | Verwandelt die Buchstaben eines Strings in Großbuchstaben |
substr | Liefert einen Teilstring aus einem String |
strtok | Zerlegt einen String in einzelne Teile, wobei ein Trennzeichen, etwa das Leerzeichen, bestimmt, wo getrennt werden soll. Die Funktion liefert bei jedem erneuten Aufruf den jeweils nächsten Teilstring. |
ereg_replace | Sucht nach einem Teilstring innerhalb eines Strings und ersetzt diesen durch einen anderen String. |
eval | Wertet einen als String übergebenen Ausdruck aus. |
Auch in PHP kann man reguläre Ausdrücke nutzen | |
wordwrap | Führt nach einer bestimmenden Zeichenzahl einen Zeilenumbruch durch. |
Multibyte Funktionen umfassen auch die deutschen Umlaute und das ß.
$info = "Hallöchen Welt, wie geht es dir?";
Die Anzahl der Zeichen
32
Alles in Kleinbuchstaben.
hallöchen welt, wie geht es dir?
Alles in Großbuchstaben
HALLÖCHEN WELT, WIE GEHT ES DIR?
Die Zeichen werden in einem Array hinterlegt.
Siehe auch explode() und implode()
Gibt die Codenummer des Zeichens aus.
83
Gibt das Zeichens einer Codenummer aus.
b
Position vom Anfang der Zeichenkette aus gesehen.
6
Position vom Anfang, Groß und Kleinschreibung wird nicht unterschieden
0
Vom Ende aus gesehen.
22
Vom Ende aus Groß- und Kleinschreibung wird nicht unterschieden.
22
Die Methode mb_stripos() und auch die anderen hier aufgeführten Methoden können als dritten Parameter einen Positionswert haben, ab dem der String durchsucht wird. In dieser while Schleife kann man so alle Vorkommen von "denkst" ermitteln. Wenn der gesuchte Wert nicht vorhanden ist liefert mb_stripos den Wert false und somit wird die while Schleife beendet.
Mit der Methode mb_substr() kann man sich einen Teilstring ausgeben lassen.
$gedanke = "Wenn du denkst du denkst, dann denkst du nur du denkst";
Wenn du denkst du denkst, dann denkst du nur du denkst.
8 / denkst du
18 / denkst, da
31 / denkst du
48 / denkst.
Einen String kann man nach einem Teilstring durchsuchen mit mb_ereg_init()
lässt sich nach bestimmten Zeichenfolgen suchen, auch reguläre Ausdrücke sind möglich.
mb_ereg_search_init($info, "XXX");
Suche nach Zeichenfolge
mb_ereg_search()
liefert true, bei erfolgreicher Suche
echo mb_ereg_replace("XXX", "Willi", $info);
Ersetzt alle vorkommenden Zeichen
echo mb_eregi_replace("XXX", "Willi", $info);
Ersetzt alle vorkommenden Zeichen ignoriert Groß-
und
Kleinschreibung
Achtung Wenn man nach Zeichen sucht, welche in regulären Ausdrücken eine Bedeutung haben, wie beispielsweise der Punkt, muss man das Zeichen mit einem vorangestelltem Backslash maskieren.
Folgendes Beispiel
XXX mag dich sehr, du solltest mit XXX mehr Zeit verbringen
Gefunden: XXX |
mb_ereg_search_init($info, "XXX"); if (mb_ereg_search()) echo "Gefunden: XXX "; |
Treffer 1 Treffer 2 |
$i = 0; mb_ereg_search_init($info, "XXX"); while (mb_ereg_search()) echo "Treffer " . ++$i . "<br>"; |
Willi mag dich sehr, du solltest mit Willi mehr Zeit verbringen | echo mb_ereg_replace("XXX", "Willi", $info); |
ein Stringverleich vergleicht eine gesamte Zeichenfolge oder Teile daraus.
Für die gesamte Zeichenfolge nimmt man das doppelte Gleichheitszeichen. Dadurch wird true (bzw. 1) zurückgegeben.
1 | <?php echo "Blödmann"=="Blödmann"; ?> |
das stimmt nicht | <?php if("Blödmann"=="blödmann"){ echo "das stimmt"; } else{ echo "das stimmt nicht"; } ?> |
htmlspecialchars()
wandelt Sonderzeichen in HTML-Entities um. Zeichen, die zum Zeichenvorrat von HTML gehören wie > < aber auch andere Zeichen wie & und " können maskiert werden. Siehe dazu meinen Tipp Zeichen maskieren.
Das ist wichtig, damit Manipulationen des HTML Codes genannt XSS vermieden wird. Ohne die Maskierung von HTML Zeichen könnte HTML Code oder Javascript Code eingeschleust werden. Schon ein nicht geschlossenes style- Tag würde den Rest der Seite nicht mehr anzeigen.
Diese Maskierung lässt sich in PHP mit der Funktion htmlspecialchars()
erzeugen.
Der erste Parameter erwartet den String.
$htmltext = "2 < 4 && \" 6 \" == '5' öäß ! ";
echo htmlspecialchars($htmltext);
echo "<br>\n";
echo htmlspecialchars($htmltext, ENT_QUOTES);
echo "<br>\n";
echo htmlspecialchars($htmltext, ENT_NOQUOTES);
echo "<hr>\n";
$mit = htmlspecialchars($htmltext);
$ohne = htmlspecialchars_decode($mit);
echo $ohne;
echo "<hr>\n";
echo = htmlentities($htmltext);
In dem zweiten Parameter kann man angeben, wie mit Anführungszeichen verfahren wird. Standardmäßig werden doppelte Anführungszeichen maskiert, aber einfache nicht.
Mit ENT_QUOTES werden auch einfache Anführungszeichen maskiert.
htmlspecialchars($myHtml, ENT_QUOTES) ;
mit ENT_NOQUOTES werden keine Anführungszeichen maskiert.
htmlspecialchars($htmltext, ENT_NOQUOTES);
Man kann den String mit Maskierungen auch wieder umwandeln mit:
$ohne = htmlspecialchars_decode($mit);
Der Unterschied von htmlentities() ist, dass im Gegensatz zu htmlspecialchars() auch die Sonderzeichen wie öäüß umgewandelt werden.
Um Groß und Kleinschreibung nicht zu beachten, verwendet man strcasecmp. Hier wird bei Übereinstimmung der Wert 0 zurückgegeben.
0 0 0 |
<?php echo strcasecmp("grüne Vase", "Grüne Vase"),"<br>"; echo strcasecmp("Grüne Vase", "grüne vase"),"<br>"; echo strcasecmp("Grüne Vase", "Grüne Vase"); ?> |
das stimmt | <?php $Teststring = strcasecmp("grüne Vase", "Grüne Vase"); if($Teststring==0){ echo "das stimmt"; } else{ echo "das stimmt nicht"; } ?> |
Will man nur einen Teil des Strings vergleichen, kann man mb_strpos
einsetzen. Die
Funktion liefert die Position eines Strings in einem anderen String. Beachte die
erste Position oder der erste Buchstabe ist 0. Außerdem werden Leerzeichen
natürlich auch mitgezählt.
Man kann in einer if Abfrage testen, ob das Wort in einem Text vorhanden ist.
Jedoch sollte man wie unten im Beispiel >-1
anstatt >=0 schreiben,
da 0 gleichzeitig für den Wert false steht, was zu Problemen führen
kann.
Das erste Argument ist die lange Zeichenkette, in der gesucht wird, das zweite
Argument ist die Zeichenkette, nach der gesucht werden soll. Als drittes Argument
kann man optional einen Zahlenwert angeben, welcher die Position bestimmt, ab
der gesucht wird. Das heißt bei 0 wird vom ersten Buchstaben an gesucht.
21 | <? $Lied = "Ein Danklied sei dem Herrn für alle seine Gnade"; $Wort= "Herrn"; echo mb_strpos($Lied,$Wort); ?> |
das Wort ist vorhanden | <?php $Wort= "Emanuel"; $Lied = "Ach komm ach komm Emanuel"; if(mb_strpos($Lied, $Wort)> -1){ echo "das Wort ist vorhanden"; } else{ echo "das Wort ist nicht vorhanden"; } ?> |
5 5 25 7 |
<?PHP $text ="Mein Hirt ist Gott der Herr"; echo mb_strpos($text,"Hirt"), "<br>"; echo mb_strpos($text,"H"), "<br>"; echo mb_strpos($text,"r",23), "<br>"; echo mb_strpos($text,"r",0); ?> |
Mit folgenden Funktionen lässt sich die Position eines Zeichens ermitteln.
$info = "Hallöchen Welt, wie geht es dir?";
Position vom Anfang der Zeichenkette aus gesehen. Das erste Zeichen ist Position 0.
6
Position vom Anfang, Groß und Kleinschreibung wird nicht unterschieden. Es beginnt bei 0.
0
Vom Ende aus gesehen.
22
Vom Ende aus Groß- und Kleinschreibung wird nicht unterschieden.
22
Die Methode mb_stripos()
und auch die anderen hier aufgeführten Methoden können als dritten Parameter
eine Positionswert haben, ab dem der String durchsucht wird. In dieser while Schleife kann man so alle
Vorkommen von "denkst" ermitteln, die in dem Satz vorkommen: "Wenn du denkst du denkst, dann denkst du
nur du denkst".
Eine Teilzeichenkette von $gedanke, ab dem 4ten Zeichen die nächsten 10 Zeichen. Würde das letzte Argument 10 fehlen, würde die Zeichenkette bis zum Ende ausgegeben.
mittels substr() lassen
sich Teile einer Zeichenkette ausgeben. Es werden 3 Argumente erwartet,
1. die Zeichenkette,
2. die Startposition beginnend bei 0, für den ersten Buchstaben, 1 beim zweiten etc.
3. optional, die Anzahl der auszugebenden Zeichen, ohne Argument wird bis zum Ende ausgegeben.
Gott | <?php $text="Mein Hirt ist Gott der Herr, er wird mich immer weiden. Er waltet nah und fern."; echo substr($text,14,5); ?> |
.php | <?php $Pfad="D:\documente\vertraulich\amigo.php"; $Pos = strpos($Pfad, "."); $Len = strlen($Pfad); echo substr($Pfad, $Pos, $Len-$Pos); ?> |
Mit chop() kann man Zeichen vom rechten Ende eines Strings entfernen.
Hallo | <?php $gruss = "Hallo Welt"; echo chop($gruss, "Welt"); ?> |
Bleibt der 2te Parameter leer, also die zu entfernenden Zeichen, wird am rechten Ende folgendes entfernt.
siehe auch PHP Manual trim
Leerzeichen können zu Fehlern führen, daher ist es gut zu wissen, wie man diese entfernt. Da im folgenden Beispiel ein Leerzeichen hinter AG steht, kommt es zu einem unschönen Ergebnis.
nö, die Firma heißt anders | <?php $Firma = "Monster AG "; if($Firma =="Monster AG"){ echo "das stimmt"; } else{ echo "nö, die Firma heißt anders"; } ?> |
das stimmt | <?php $Firma = "Monster AG "; if(trim($Firma) =="Monster AG"){ echo "das stimmt"; } else{ echo "nö, die Firma heißt anders"; } ?> |
Ein zweiter Parameter bei trim() ermöglicht die Angabe, welche Zeichen am Anfang und Ende entfernt werden sollen. Es können auch mehrere unterschiedliche Zeichen sein.
Im folgendem Beispiel werden Punkte und einfache Anführungszeichen am Anfang und Ende entfernt.
$name = "'O'Brian'..."; echo trim($name, "'.'");
O'Brian
Die Verwandlung in Groß oder Kleinbuchstaben kann man auch gut dazu einsetzen, Zeichenketten unabhängig von Groß- und Kleinschreibung zu überprüfen (siehe Beispiel if...).
Beide Funktionen gibt es auch als Multibyte Funktionen: mb_strtolower, mb_strtoupper
monster ag MONSTER AG |
<?php echo strtolower($Firma),"<br>"; echo strtoupper($Firma); ?> |
das stimmt | <?php $schimpfwort="blödmann"; if(strtolower("Blödmann")==strtolower($schimpfwort)){ echo "das stimmt"; } else{ echo "das stimmt nicht"; } ?> |
Formulareingaben sind immer strings, oft muß man diese in Teile zerlegen. Das kann man mit der Funktion strtok() machen. Die Argrumente sind Text (bzw.Variable) und Trennzeichen. Nach dem erneuten Aufruf von strtok reicht das zweite Argument.
Hallo, Welt |
<?php $text="Hallo, Welt"; echo strtok($text," "); echo "<br>"; echo strtok(" "); ?> |
23 04 2002 |
<?php $Datum = "23.04.2002"; $Teil=strtok($Datum,"."); while($Teil){ echo $Teil,"<br>"; $Teil = strtok("."); } ?> |
Eine strtok() sehr ähnliche Funktion ist explode(), wo jedoch ein Array ausgegeben wird, dessen Elemente man in einer Schleife auslesen kann. Hierbei ist das erste Argument das Trennzeichen, das zweite der auszulesende Textstring.
30 02 1879 |
<?php $Datum = "30.02.1879"; $Teile=explode(".",$Datum); foreach($Teile as $Teil){ echo $Teil, "<br>"; } ?> |
Das Gegenstück implode() wird dazu verwendet, die Elemente eines Arrays zu einem Textstring zusammenzufügen. Als erstes Argument wird ein "Trennzeichen" (hier der br Tag) und als zweites Argument der Arrayname angegeben. Wie man sieht ist hier keine Schleife erforderlich.
Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag |
<?php $Wochentage=array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); echo implode("<br>",$Wochentage); ?> |
siehe auch EDV Lehrgang printf()
Ausgaben kann man mit echo
oder
print
erzeugen. Außerdem kann man mit printf()
oder sprintf()
Ausgaben mit bestimmte
Formatierungen erzeugen. Der Unterschied zwischen printf()
und sprintf()
ist folgender mit printf()
wird die Ausgabe
direkt an den Browser übergeben wie bei echo
. Mit sprintf()
wird eine Zeichenfolge erzeugt,
die man einer Variablen übergeben kann, oder mittels echo
ausgeben kann.
Beide Zeilen erzeugen die Ausgabe im Browser:
Hallo Beate und Herbert.
$name = "Beate"; $partner = "Herbert"; echo sprintf("Hallo %s und %s", $name, $partner); printf("Hallo %s" und %s, $name, $partner);
Beide Funktionen benötigen als erstes Argument einen String in dem sich ein oder mehrere Formatspezifkatoren befinden. Im Beispiel oben sind es die %s
Zeichen. Nach diesem String folgen mehrere Argumente, die in der gleichen Reihenfolge den Formatspezifkatoren zugewiesen werden. Das erste Argument nach dem String wird dem ersten Formatspezifikator zugewiesen, das zweite Argument nach dem String wird dem zweiten Formatspezifikator zugewiesen u.s.w. Diese Reihenfolge kann man ändern, dazu später mehr. Weitere Formatspezifikatoren siehe unten.
$x = 134.5678
EUR 134.57 | <?php printf("EUR %.2f", $x); ?> |
EUR 134.57 | <?php echo sprintf("EUR %.2f", $x); ?> |
Das erste Argument ist der String mit den Formatzuweisungen, die weiteren Argumente enthalten die zu formatierenden Werte. Der Formatspezifikator wird mit dem Prozentzeichen eingeleitet, der Text davor wird unverändert ausgegeben.
In den folgenden Beispielen gibt es eine Variable $x;
$x = 1234.5678;
Format-spezifikator | Beispiel | Ausgabe | Erklärung |
---|---|---|---|
%d |
printf(" %d", $x); |
1234 | Ganzzahl vorzeichenbehaftet |
%s |
printf("%s", $x); |
1234.5678 | String Zeichenkette |
%b |
printf(" %b", $x); |
10011010010 | Ganzzahl als Binärzahl |
%x | printf(" %x", $x); | 4d2 | Ganzzahl als Hexdezimalzahl |
%f |
printf("%f", $x); |
1234.567800 | Fließkommazahl mit mindestens 6 Stellen hinter dem Komma |
%.2f | printf(%.2f", $x); |
1234.57 | Fließkommazahl mit 2 Stellen hinter dem Punkt (Komma). Die Anzahl wird nach einem Punkt angegeben. |
%05d
|
printf("%05d", $x); |
01234 | Hat man insgesamt weniger als 5 Zeichen inklusive Nachkommstellen, werden Nullen vorangestellt. Das d definiert eine Ganzzahl. |
%08.2f | printf(" %08.2f", $x); |
01234.57 | Hat man insgesamt weniger als 8 Zeichen inklusive Nachkommstellen, werden 0 Nullen vorangestellt. Es werden 2 Stellen nach dem Komma angezeigt wegen .2f |
%'*7d | printf("%'*7d", $x); |
***1234 | Möchte man ein anderes Zeichen voranstellen muss man ein Hochkomma davor angeben. Wäre der gesamte String in Hochkomma eingeschlossen, würde man ein doppeltes Anführungszeichen nach dem Prozentzeichen einsetzen. |
%2$s | $a = "Hut"; $b = "Stock"; printf('%2$s und %1$s', $a, $b); |
Stock und Hut | Reihenfolge festlegen. Hat man mehrere Formatspezifkatoren gilt der erste für das erste Argument nach dem String, der nächste für das zweite usw. Man kann die Reihenfolge ändern mit einer Zahl und einem darauf folgendem Dollarzeichen. Achtung!
|
Will man Strings in Ausdrücke umwandeln und zur Laufzeit auswerten, braucht man die Funktion eval(). Das Argument der Funktion muß ausführbaren Code enthalten, wobei auch der abschließende Strichpunkt nicht fehlen darf, z.B. eine Ausgabe mit echo. Auch hier dürfen keine Anführungszeichen verschachtelt sein, deshalb sollte man einfache Anführungszeichen verwenden oder das Escape Zeichen (den Backslash \ ) vor die Anführungszeichen setzen. Im dritten Beispiel sieht man, dass sich auch Variablen einsetzen lassen.
MwSt: 160Euro | <?php eval ("echo 'MwSt: ', 1000*0.16, 'Euro';"); ?> |
MwSt:160Euro | <?php eval ("echo \"MwSt:\" ,1000*0.16 , \"Euro\" ;"); ?> |
MwSt:160Euro | <?php $MwSt = 0.16; eval ("echo \"MwSt:\" ,1000*$MwSt, \"Euro\";"); ?> |
siehe meine Javascript Tipps Regex.
Beispielsammlung regulärer Ausdrücke
Mit regulären Ausdrücken (Regex) kann man ein Muster definieren, mit dem man eine Zeichenkette durchsucht. So lässt sich beispielsweise untersuchen, ob es sich formal um eine gütlige Email Adresse handelt. Man könnte ein Muster definieren, dass alle Worte, die mit S anfangen, findet. Auch komplexere Anfragen sind möglich, beispielsweise um die Vorgabe für ein Passowort zu definieren, welches aus einer Mindestanzahl bestehen muss und in dem bestimmte Zeichen vorkommen müssen.
Reguläre Ausdrücke können als Filterkriterien in der Textsuche verwendet werden, indem der Text mit dem Muster des regulären Ausdrucks abgeglichen wird.
Um reguläre Ausdrücke zu nutzen, erstellt man zuerst ein Muster.
Dann kann man mit verschiedenen Funktionen einen String auf dieses Muster durchsuchen oder Teile des Strings
anhand des Musters ersetzen.
Ein Muster erstellt man innerhalb von 2 Slashes /
preg_match()
liefert einen boolschen Wert, 1=true oder 0=false;
$info = "Riggediriggedirick"; $muster = "/di/"; echo preg_match($muster, $info);
Man kann mit preg_replace()
auch Stellen in einem String ersetzen.
$info = "xxx hat ein großes Raumschiff."; $muster = "/xxx/"; $name = "Rick"; echo preg_replace($muster, $name, $info);
Es folgen einige Regeln für Muster. Weitere Regeln siehe Javascript Tipps.
Man kann mit eckigen Klammern eine einfache Zeichenklasse definieren. Das bedeutet, dass nur eines der Zeichen vorkommen muss. Im folgendem Beispiel wird true geliefert wenn ein a oder b oder c vorkommt.
/[abc]/
Für die Muster gibt es vordefinierte Zeichenklassen, wie
Ziffern von 0 bis 9 \d
Whitespace \s
Zeichen das keine Zahl ist \D
Es gibt Begrenzungen für Anfang und Ende
Anfang der Zeile ^
Ende der Zeile oder Eingabe $
Wortabgrenzung \b
Es gibt Quantifizierer mit denen man bestimmen kann wieviele Zeichen oder Zeichenklassen oder Gruppen vorkommen müssen.
?
bedeutet höchstens 1 mal
*
0 mal oder mehrmals
+
einmal oder mehrmals
{n}
genaues Vorkommen n mal
{n,m}
mindestens n mal höchstens m mal
Man kann mit runden Klammern Gruppen bilden, auf die man auch einen Quantifizierer anwenden kann. Im folgendem Beispiel muss vorkommen: lalalalolo davor und dahinter können weitere Zeichen folgen
/(la){3}(lo){2}/
Es folgen ein paar Beispiele zum kopieren, einfügen, ausprobieren.
$info = "Rigge di rigge di rick"; $muster = "/di/"; echo preg_match($muster, $info); //erste Ausgabe echo "<br>\n"; //eckige Klammern, bedeutet, wenn eins der Zeichen vorkommt wird true geliefert $muster = "/[döa]/"; echo preg_match($muster, $info); //zweite Ausgabe echo "<br>\n"; //man kann mehrere Bereiche in Klammern notieren //. ein beliebiges Zeichen //* das voranstehende Zeichen 0 mal oder mehrmals //In dem String muss mindestens 2 mal di vorkommen $muster = "/(di)(.*)(di)/"; echo preg_match($muster, $info); //dritte Ausgabe echo "<br>\n"; //{2} genaues Vorkommen des vorangegangenen Zeichens oder der Gruppe //auch hier muss 2 mal di vorkommen $muster = "/(di.*){2}/"; echo preg_match($muster, $info); //vierte Ausgabe echo "<br>\n"; //^Anfang der Zeile // $Ende der Zeile //[A-Za-z] Groß und Kleinbuchstaben //es müssen 3 Großbuchstaben sein $info = "BDF"; $muster = "/^[A-Z]{3}$/"; echo preg_match($muster, $info); //fünfte Ausgabe echo "<br>\n"; //{3,4} das vorangegangene Zeichen oder Gruppe mindestens 3 höchstens 4 mal //3 Buchstaben und 4 Zahlen $info = "aDs4305"; $muster = "/^[A-Za-z]{3}[0-9]{4}$/"; echo preg_match($muster, $info);//sechste Ausgabe
Es folgt ein Beispiel mit Erklärung für eine Passworteingabe. Das Passwort muss eines der Sonderzeichen !$& enthalten und aus mindesten 8 Zeichen bestehen. Erklärungen auf der Seite.
if (isset($_POST["gesendet"])) { $info = trim($_POST["passwort"]); $muster = "/^(?=.*[!&$])(?=.*[A-Za-z0-9]).{5,}$/"; if (preg_match($muster, $info)) { echo "Das Paswort ist gültig"; } else { echo "Das Passwort ist nicht gültig.
Es muss mindestens 8 Zeichen haben und mindestens eines der folgenden Zeichen enthalten:
!$&"; } }
Webdesign / PHP / mySQL / Dreamweaver MX Tipps
Copyright © Michael Albers
www.pastorpixel.de