Kapitel J Zeichenketten-Funktionen
Funktionen zur Analyse, Umwandlung und Bearbeitung von Zeichenketten, wie sie häufig in Eingaben von Benutzern vorkommen, sind Inhalt des vorliegenden Abschnittes.
Strings
Aus Formular-Eingabefeldern, Dateien und Datenbanken gelangen häufig Zeichenketten (Strings) in ein weiterverarbeitendes PHP-Programm, die analysiert und bearbeitet werden müssen. Zu diesem Zwecke werden eine Reihe von Zeichenketten-Funktionen zur Verfügung gestellt. Einige nützliche Funktionen sollen hier vorgestellt werden.
J.1 Länge, Umwandlungsfunktionen  
Umwandlung
Die Länge einer eingegebenen Zeichenkette wird mit strlen() gemessen. Alle eingegebenen Zeichen können in Kleinbuchstaben (strtolower()) oder Großbuchstaben (strtoupper()) umgewandelt werden. Der erste Buchstabe einer Zeichenkette (ucfirst()) oder jedes einzelnen Wortes (ucwords()) kann in einen Großbuchstaben verwandelt werden. Die Zeichenkette kann umgedreht werden (strrev()).
Bestimmte Zeichen (strtr()) oder Teil-Zeichenketten (str_replace()) können durch andere Zeichen bzw. andere Teil-Zeichenketten ersetzt werden.
In dem nachfolgendem Formular soll eine beliebige Zeichenkette eingegeben werden, die anschließend von einem Programm mittels verschiedener Methoden umgewandelt wird.
Zunächst der Programmcode:
Listing J.1 Datei uj01.htm
<html>
<body>
Tragen Sie einen Test-Satz ein, und senden Sie
das Formular ab<br>
Der Satz sollte einige Worte umfassen,
damit das Ergebnis erkennbar wird
<form action = "uj01.php" method = "post">
<input name="test" size="50"><p>
<input type="submit" value="Absenden"><p>
</form>
</body>
</html>
Abbildung J.1 Zeichenkette zur Umwandlung
|
Das Ergebnis der verschiedenen Umwandlungen sieht wie folgt aus:
Abbildung J.2 Umwandlungen einer Zeichenkette
|
Hier das Programm:
Listing J.2 Datei uj01.php
<html>
<body>
<?php
echo "Umwandlungs-Funktionen:<p>";
echo "<TABLE BORDER>";
echo "<TR> <TD>Funktion</TD> <TD>Erläuterung</TD>
<TD>Ergebnis</TD> </TR>";
echo "<TR> <TD> </TD> <TD>Original</TD>
<TD>$test</TD> </TR>";
$lg = strlen($test);
echo "<TR> <TD>strlen</TD> <TD>Länge</TD>
<TD>$lg</TD> </TR>";
$kl = strtolower($test);
echo "<TR> <TD>strtolower</TD> <TD>alles klein</TD>
<TD>$kl</TD> </TR>";
$gr = strtoupper($test);
echo "<TR> <TD>strtoupper</TD> <TD>alles groß</TD>
<TD>$gr</TD> </TR>";
$uf = ucfirst($test);
echo "<TR> <TD>ucfirst</TD> <TD>erstes Zeichen groß</TD>
<TD>$uf</TD> </TR>";
$uw = ucwords($test);
echo "<TR> <TD>ucwords</TD> <TD>erstes Zeichen jedes
Wortes groß</TD> <TD>$uw</TD> </TR>";
$rv = strrev($test);
echo "<TR> <TD>strrev</TD> <TD>umdrehen</TD>
<TD>$rv</TD> </TR>";
$tr = strtr($test,"ab","AB");
echo "<TR> <TD>strtr</TD> <TD>alle 'a' und 'b' ersetzt
durch 'A' und 'B'</TD> <TD>$tr</TD> </TR>";
$rp = str_replace("hallo","hi",$test);
echo "<TR> <TD>str_replace</TD> <TD>alle 'hallo' ersetzt
durch 'hi'</TD> <TD>$rp</TD> </TR>";
echo "</TABLE>";
?>
</body>
</html>

J.2 Zeichenketten und Arrays  
Arrays, Separatoren
Mit Hilfe der Funktion explode() kann eine Zeichenkette in ein Array umgewandelt werden. Die Zeichenkette wird bei jedem Auftreten einer sogenannten »Separator-Zeichenkette« getrennt. Diese Separator-Zeichenkette kann aus einem einzelnen Zeichen wie z. B. einem Leerzeichen oder einem Semikolon, aber auch aus mehreren Zeichen bestehen. Anschließend können die einzelnen Elemente des Arrays mit den Methoden und Funktionen für Arrays weiter bearbeitet werden.
Den umgekehrten Vorgang, nämlich das Erzeugen einer Zeichenkette aus einem Array, zusammen mit einem Separator-String, ermöglicht die Funktion implode(). Ein Beispiel:
Abbildung J.3 Zeichenketten und Arrays
|
Es folgt der Programmcode:
Listing J.3 Datei uj02.php
<html>
<body>
<?php
$test = "Dies ist ein kurzer Satz";
$worte = explode(" ",$test);
$lg = sizeof($worte);
for($i=0; $i<$lg; $i++)
{
echo "Wort $i: $worte[$i] <br>";
}
echo "<p>";
$feld = array(17.5, 19.2, 21.8, 21.6, 17.5);
$test = implode(";",$feld);
echo "Eine Zeichenkette:<br>$test";
?>
</body>
</html>
Mit Hilfe der Funktion explode() wird die Zeichenkette $test in ein Array verwandelt. Jedes Leerzeichen wird als Separator zum nächsten Array-Element angesehen. Anschließend wird mit Hilfe der Array-Funktion sizeof() die Größe des Arrays festgestellt. Eine for-Schleife dient dazu, jedes Element des Arrays einzeln und nummeriert auszugeben.
Der Array $feld umfasst 5 Elemente. Diese Elemente werden mit Hilfe der Funktion implode() und einiger Semikola in die Zeichenkette $test zusammengeführt.
J.3 Teil-Zeichenketten  
Extraktion von Teilstrings
Teile von Zeichenketten können mit verschiedenen Methoden extrahiert werden. Bei Nutzung der Funktion substr() wird angegeben, ab welcher Position innerhalb des Strings und über welche Länge hinweg extrahiert werden soll:
|
Falls der zweite Parameter der Funktion substr() positiv ist, beginnt die zurückgegebene Teil-Zeichenkette ab der angegebenen Nummer vom Beginn des Originals aus gemessen. Die Nummer des ersten Zeichens des Originals ist 0. |
|
Falls der zweite Parameter der Funktion substr() negativ ist, beginnt die zurückgegebene Teil-Zeichenkette ab der angegebenen Nummer vom Ende des Originals aus gemessen. |
|
Falls der dritte Parameter der Funktion substr() existiert und positiv ist, werden entsprechend viele Zeichen zurückgegeben. |
Bei Nutzung der Funktion strstr() wird ein Zeichen oder eine Zeichenkette angegeben, ab dessen/deren erstem Auftreten bis zum Ende des Strings extrahiert werden soll. Die Funktion stristr() führt das Gleiche aus, in diesem Falle aber unabhängig von der Groß- und Kleinschreibung des Vergleichsstrings.
Die Funktion strrchr() sucht nach dem letzten Auftreten eines einzelnen Zeichens und extrahiert ab dieser Stelle. Ein Beispiel:
Abbildung J.4 Teil-Zeichenketten
|
Es folgt der Programmcode:
Listing J.4 Datei uj03.php
<html>
<body>
<?php
$test = "info@rz.uni-hannover.de";
echo "Teil-Zeichenketten:<p>";
echo "<TABLE BORDER>";
echo "<TR> <TD>Funktion</TD> <TD>Erläuterung</TD>
<TD>Ergebnis</TD> </TR>";
echo "<TR> <TD> </TD> <TD>Original</TD>
<TD>$test</TD> </TR>";
$sub1 = substr($test,3);
echo "<TR> <TD>substr</TD> <TD>ab Zeichen 3 bis Ende</TD>
<TD>$sub1</TD> </TR>";
$sub2 = substr($test,3,5);
echo "<TR> <TD>substr</TD> <TD>ab Zeichen 3,
5 Zeichen</TD> <TD>$sub2</TD> </TR>";
$sub3 = substr($test,-5);
echo "<TR> <TD>substr</TD> <TD>ab fünftletztem
Zeichen bis Ende</TD> <TD>$sub3</TD> </TR>";
$sub4 = substr($test,-5,2);
echo "<TR> <TD>substr</TD> <TD>ab fünftletztem Zeichen,
2 Zeichen</TD> <TD>$sub4</TD> </TR>";
$xdomain = strstr($test, "@");
echo "<TR> <TD>strstr</TD> <TD>ab Zeichen @,
bis Ende</TD> <TD>$xdomain</TD> </TR>";
$domain = substr($xdomain,1);
echo "<TR> <TD>substr</TD> <TD>hinter Zeichen @,
bis Ende</TD> <TD>$domain</TD> </TR>";
$xcountry = strrchr($test, ".");
echo "<TR> <TD>strrchr</TD> <TD>ab letztem Zeichen
'Punkt', bis Ende</TD> <TD>$xcountry</TD> </TR>";
$country = substr($xcountry,1);
echo "<TR> <TD>substr</TD> <TD>hinter letztem Zeichen
'Punkt', bis Ende</TD> <TD>$country</TD> </TR>";
echo "</TABLE>";
?>
</body>
</html>

J.4 Suchen in Zeichenketten  
Suchen nach Zeichen
Die Funktionen strpos() und strrpos() dienen zum Suchen nach bestimmten Zeichen oder Zeichenketten innerhalb anderer Zeichenketten. Es wird die Position zurückgeliefert, an der etwas gefunden wurde. Dabei sucht
|
die Funktion strpos() ohne Offset-Angabe nach dem ersten Vorkommen des Zeichens oder der Zeichenkette, |
|
die Funktion strpos() mit Offset-Angabe nach dem ersten Vorkommen des Zeichens oder der Zeichenkette ab dem Offset, |
|
die Funktion strrpos() nach dem letzten Vorkommen eines Zeichens (keiner Zeichenkette). |
Ein Beispiel:
Abbildung J.5 Suchen nach Zeichenketten
|
Hier der Programmcode:
Listing J.5 Datei uj04.php
<html>
<body>
<?php
$test = "info@edvgruppe.biologie.uni-hannover.de";
echo "Suchen in Zeichenketten:<p>";
echo "<TABLE BORDER>";
echo "<TR> <TD>Funktion</TD> <TD>Erläuterung</TD>
<TD>Ergebnis</TD> </TR>";
echo "<TR> <TD> </TD> <TD>Original</TD>
<TD>$test</TD> </TR>";
$pos1 = strpos($test,".");
echo "<TR> <TD>strpos</TD> <TD>Position des ersten
Zeichens 'Punkt'</TD> <TD>$pos1</TD> </TR>";
$pos2 = strpos($test,".",15);
echo "<TR> <TD>strpos</TD> <TD>Position des ersten
Zeichens 'Punkt', ab Position 10</TD>
<TD>$pos2</TD> </TR>";
$pos3 = strrpos($test,".");
echo "<TR> <TD>strrpos</TD> <TD>Position des letzten
Zeichens 'Punkt'</TD> <TD>$pos3</TD> </TR>";
echo "</TABLE>";
?>
</body>
</html>
J.5 Vergleich von Zeichenketten  
Vergleiche
Die Funktionen strcmp() und strcasecmp() dienen zum Vergleich von zwei Zeichenketten gemäß ihrer Reihenfolge im ASCII-Code. Dabei wird bei der Funktion strcmp() auf die Groß- und Kleinschreibung geachtet, bei der Funktion strcasecmp() hingegen nicht.
Die Funktion similar_text() stellt fest, wie viele Zeichen innerhalb zweier Zeichenketten übereinstimmen. Ein Beispiel:
Abbildung J.6 Vergleich von Zeichenketten
|
Der Programmcode:
Listing J.6 Datei uj05.php
<html>
<body>
<?php
$ErsterName = "Maier";
$ZweiterName = "Mertens";
$DritterName = "maier";
echo "Mit Beachtung der Groß- und Kleinschreibung
(strcmp):<p>";
if (strcmp($ErsterName,$ZweiterName) < 0)
echo "$ErsterName steht vor $ZweiterName<p>";
else
echo "$ZweiterName steht vor $ErsterName<p>";
if (strcmp($ZweiterName,$DritterName) < 0)
echo "$ZweiterName steht vor $DritterName<p>";
else
echo "$DritterName steht vor $ZweiterName<p>";
echo "Ohne Beachtung der Groß- und Kleinschreibung
(strcasecmp):<p>";
if (strcasecmp($ZweiterName,$DritterName) < 0)
echo "$ZweiterName steht vor $DritterName<p>";
else
echo "$DritterName steht vor $ZweiterName<p>";
echo "Ähnlichkeit (similar_text):<p>";
$erg1 = similar_text($ErsterName,$ZweiterName);
$erg2 = similar_text($ErsterName,$DritterName);
echo "Zwischen $ErsterName und $ZweiterName:
$erg1 gleiche Buchstaben<p>";
echo "Zwischen $ErsterName und $DritterName:
$erg2 gleiche Buchstaben<p>";
?>
</body>
</html>
J.6 Codierung von Zeichen  
ASCII-Code
Jedem Zeichen einer Zeichenkette entspricht ein Zahlenwert gemäß der ASCII-Code-Tabelle. Dieser Code wird beim Speichern einer Zeichenkette intern verwendet. Vergleichsfunktionen wie strcmp() basieren auf dieser Reihenfolge innerhalb des ASCII-Codes. Die Code-Tabelle teilt sich in die folgenden Bereiche auf:
|
Die Zeichen 0 bis 31 sind hauptsächlich Steuerzeichen zur Bildschirmsteuerung, also keine sichtbaren Zeichen |
|
Die Zeichen 32 bis 127 beinhalten u. a. die Ziffern 0 bis 9 (Code 48 bis 57), die Großbuchstaben (Code 65 bis 90), die Kleinbuchstaben (Code 97 bis 122) und Sonderzeichen wie z. B. Komma, Doppelpunkt, Semikolon usw. |
|
Die Zeichen 128 bis 255 beinhalten weitere Sonderzeichen, abhängig von der für den Rechner gewählten Codeseite und der Ländereinstellung |
chr, ord
Die Zeichenketten-Funktion chr([Zahlenwert]) liefert als Rückgabewert das Code-Zeichen des angegebenen Zahlenwertes. Die Funktion ord([Zeichen]) macht das Gegenteil, sie liefert die Code-Nummer zu dem angegebenen Zeichen. Das folgende Beispiel-Programm liefert dem Benutzer eine HTML-Tabelle der Zeichen von 32 bis 255, wie sie auf seinem Rechner verwendet werden:
Zunächst der Programmcode:
Listing J.7 Datei uj06.php
<html>
<body>
<?php
echo "<TABLE BORDER><TR>";
for ($i=32; $i<=255; $i++)
{
echo "<TD>$i</TD><TD><B>" . chr($i) . "</B></TD>";
if ($i%12 == 7) echo "</TR><TR>";
}
echo "</TR></TABLE>";
?>
</body>
</html>
Mit Hilfe des modulo-Operators (%) wurde dafür gesorgt, dass die HTML-Tabelle eine gleichmäßigen Aufbau hat. Falls die Division des aktuellen Code-Wertes durch 12 den Rest 7 ergibt, wird die aktuelle Zeile beendet und eine neue Zeile begonnen. Dies ist bei jedem 12. Code-Wert (43, 55, 67, 79 usw.) der Fall.
J.6.1 Kryptographie  
Im nachfolgenden Programm wird mit Hilfe der o. a. Zeichenketten-Funktionen eine einfache Verschlüsselung eines eingegebenen Textes durchgeführt. Der Benutzer wird aufgefordert, einen Text einzugeben. Jedes einzelne Zeichen des Textes wird um einen Wert im ASCII-Code nach vorne verschoben und anschließend sowohl auf dem Bildschirm als auch in eine Text-Datei ausgegeben. Aus einem »g« wird ein »h«, aus einer »4« wird eine »5«, aus einem »X« wird ein »Y« usw.
Verschlüsselung
Schon diese einfache Verschlüsselung führt zu einem schwer lesbaren Text. Die Entschlüsselung ist nur möglich, wenn man die Verschlüsselungs-Methode kennt. Diese ist natürlich in diesem Fall noch recht einfach. Man kann sich vorstellen, daß aufwendigere Methoden zu einem Ergebnis führen, das nicht mehr so einfach zu entschlüsseln ist.
Zunächst das Formular zum Eintragen des Satzes:
Listing J.8 Datei uj07.htm
<html>
<body>
Tragen Sie einen Satz zum Verschlüsseln ein,
und senden Sie das Formular ab<br>
<form action = "uj07.php" method = "post">
<input name="test" size="50"><p>
<input type="submit" value="Absenden"><p>
</form>
</body>
</html>
Das Programm mit der Verschlüsselung:
Listing J.9 Datei uj07.php
<html>
<body>
<?php
echo "$test <p>";
// Länge der Zeichenkette
$lg = strlen($test);
// Datei zum Schreiben öffnen und sperren
$fp = fopen("uj07data.txt","w");
if ($fp)
flock($fp,2);
else
{
echo "Datei konnte nicht zum";
echo " Schreiben geöffnet werden";
}
// Jedes Zeichen einzeln umwandeln
for($i=0; $i<$lg; $i++)
{
// ein Zeichen extrahieren
$char = substr($test,$i,1);
// Code des Zeichens feststellen
$code = ord($char);
// Code des neuen Zeichens ermitteln
$newcode = $code + 1;
// Neues Zeichen erzeugen, ausgeben
$newchar = chr($newcode);
echo $newchar;
// Zusätzlich in Datei ausgeben
if ($fp) fputs ($fp, $newchar);
}
// Sperre aufheben, schließen
if ($fp)
{
flock($fp,3);
fclose($fp);
}
?>
</body>
</html>
Die Methoden zum Öffnen, Sperren und Schreiben einer Text-Datei finden sich im Abschnitt G (Text-Dateien).
Jedes einzelne Zeichen des eingegebenen Textes wird einzeln mit der Funktion substr() extrahiert. Der Code-Wert des Zeichens wird mit der Funktion ord() festgestellt. Dieser Code-Wert wird um 1 erhöht. Das Zeichen zum neuen Code-Wert wird mit der Funktion chr() ermittelt. Es wird auf dem Bildschirm und in die Text-Datei ausgegeben.
Ein Beispiel: Aus dem Satz
Das ist ein einfacher Satz
wird durch die Verschlüsselung:
Ebt!jtu!fjo!fjogbdifs!Tbu{
Übung UJ08
Entschlüsselung
Erstellen Sie ein Entschlüsselungs-Programm für die o. a. Verschlüsselungs-Methode. Es soll eine Text-Datei geöffnet werden, die in der ersten Zeile einen verschlüsselten Text beinhaltet. Jedes Zeichen der Zeile soll gelesen werden, mit der passenden Entschlüsselungs-Methode umgewandelt und auf dem Bildschirm ausgegeben werden. Es muß also der Code eines jeden einzelnen Zeichens um 1 vermindert werden (Datei uj08.php).
|