Galileo Computing <openbook>
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


PHP 4 von Thomas Theis
Webserver-Programmierung für Einsteiger
Zum Katalog
gp Kapitel J Zeichenketten-Funktionen
  gp J.1 Länge, Umwandlungsfunktionen
  gp J.2 Zeichenketten und Arrays
  gp J.3 Teil-Zeichenketten
  gp J.4 Suchen in Zeichenketten
  gp J.5 Vergleich von Zeichenketten
  gp J.6 Codierung von Zeichen

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.


Galileo Computing

J.1 Länge, Umwandlungsfunktionen  downtop

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
Abbildung

Das Ergebnis der verschiedenen Umwandlungen sieht wie folgt aus:

Abbildung J.2   Umwandlungen einer Zeichenkette
Abbildung

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>&nbsp;</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>

Galileo Computing

J.2 Zeichenketten und Arrays  downtop

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
Abbildung

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.


Galileo Computing

J.3 Teil-Zeichenketten  downtop

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:

gp  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.
gp  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.
gp  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
Abbildung

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>&nbsp;</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>

Galileo Computing

J.4 Suchen in Zeichenketten  downtop

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

gp  die Funktion strpos() ohne Offset-Angabe nach dem ersten Vorkommen des Zeichens oder der Zeichenkette,
gp  die Funktion strpos() mit Offset-Angabe nach dem ersten Vorkommen des Zeichens oder der Zeichenkette ab dem Offset,
gp  die Funktion strrpos() nach dem letzten Vorkommen eines Zeichens (keiner Zeichenkette).

Ein Beispiel:

Abbildung J.5   Suchen nach Zeichenketten
Abbildung

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>&nbsp;</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>

Galileo Computing

J.5 Vergleich von Zeichenketten  downtop

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
Abbildung

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>

Galileo Computing

J.6 Codierung von Zeichen  downtop

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:

gp  Die Zeichen 0 bis 31 sind hauptsächlich Steuerzeichen zur Bildschirmsteuerung, also keine sichtbaren Zeichen
gp  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.
gp  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:

Abbildung J.7   ASCII-Code
Abbildung

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.


Galileo Computing

J.6.1 Kryptographie  toptop

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).

  

Perl – Der Einstieg




Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: 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.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung von Galileo Press. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: stefan.krumbiegel@galileo-press.de


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, fon: 0228.42150.0, fax 0228.42150.77, info@galileo-press.de