Suchen und Ersetzen

Mit PHP kann man Texte auch durchsuchen lassen, und bestimmte Zeichen/Wörter durch einen anderen Text ersetzten lassen.

Text suchen

Möchte man überprüfen, ob ein gewisser Text in einem anderem Text enthalten ist, bietet sich die Funktion strpos($text, $suchtext) an. Diese gibt, falls der gesuchte Text vorhanden ist, die Position des ersten Vorkommens zurück. Falls der Text nicht vorhanden ist, wird false zurückgegeben.

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
$position = strpos($text, "ein");
echo "Gefunden an Position: $position";
?>

Im obigen Beispiel wird nach dem Text ein gesucht. Dieser String wird zum ersten Mal an der 9. Stelle im Text gefunden (Erinnerung: PHP fängt bei 0 an zu zählen). Die Funktion strpos() unterscheidet dabei zwischen Groß- und Kleinschreibung. Im folgenden ein paar mehr Beispiele zum Veranschaulichen der Funktionsweise:

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
echo "'ein' gefunden an Position: ".strpos($text, "ein")."<br />"; //Ausgabe: 9
echo "'eine' gefunden an Position: ".strpos($text, "eine")."<br />"; //Ausgabe: 15
echo "'Ein' gefunden an Position: ".strpos($text, "Ein")."<br />"; //Ausgabe: 47
echo "'Eine' gefunden an Position: ".strpos($text, "Eine")."<br />"; //Ausgabe: 47
?>

Der String eine wird zum ersten Mal im Wort kleines gefunden, weswegen wir dort als Wert 15 erhalten. Ein und Eine wird dagegen zum ersten Mal am Anfang des zweiten Satzes gefunden.

Wie eingangs erwähnt, gibt die Funktion false zurück, falls der Text nicht gefunden wurde. Dies können wir gut in einer if-Anweisung verwenden um zu Prüfen, ob ein Text einen gewissen Teilstring enthält.

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
$suchwort = "Ich existiere nicht";
$position = strpos($text, $suchwort);

if($position === false) {
   echo "String wurde nicht gefunden";
} else {
   echo "Gefunden an Position: $position";
}
?>

Vielleicht ist dem einem oder anderem aufgefallen, dass wir hier drei === statt zwei == in der if-Anweisung verwendet haben. Bei drei Gleichheitszeichen wird tatsächlich überprüft, dass der Wert der Variable gleich false ist. Bei zwei Gleichheitszeichen würde auch eine 0 als false interpretiert werden. Dies führt zu Problemen, wenn das Suchwort direkt am Anfang des Textes steht wie im folgenden Beispiel gezeigt:

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
$suchwort = "Dies";
$position = strpos($text, $suchwort);

echo "Mit zwei Gleichheitszeichen wurde das Suchwort '$suchwort': ";
if($position == false) { //Achtung, hier wurde fälschlicherweise nur 2 Gleichheitszeichen verwendet
   echo "nicht gefunden";
} else {
   echo "gefunden an Position: $position";
}
echo "<br />";

echo "Mit drei Gleichheitszeichen wurde das Suchwort '$suchwort': ";
if($position === false) { 
   echo "nicht gefunden";
} else {
   echo "gefunden an Position: $position";
}
?>

Möchte man unabhängig von Groß- und Kleinschreibung suchen, empfiehlt sich die Funktion stripos($text, $suchtext) .

Teiltext ausgeben

Im ersten Abschnitt haben wir gelernt, wie man überprüfen kann ob ein Suchwort in einem Text vorhanden ist. Nun können wir mit substr($text, $start, $laenge) Teilstrings von einem Text extrahieren und beispielsweise ausgeben lassen. Der dritte Parameter, $laenge, ist optional. Wird dieser nicht angegeben, wird der restliche String ausgegeben.

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
echo substr($text, 9, 11); //Ausgabe: ein kleines
?>

Mittels substr($text, 9, 11); erhalten wir 11 Zeichen der Variable $text ab der 9. Position. Dies ist in diesem Fall die Position von dem Wort ein.

Die Funktion substr() ist nützlich in vielen Bereichen, beispielsweise wenn wir nur den Anfang oder das Ende eines Textes ausgeben wollen, wir überprüfen wollen ein Text mit gewissen Zeichen startet oder um auch mal Text in der Mitte auszugeben. Nachfolgend ein paar einfache Beispiele, die ihr Schritt für Schritt durchgehen und nachvollziehen solltet.

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
echo substr($text, 0, 15)."<br />"; //Gibt den Anfang des Textes aus
echo substr($text, 12)."<br />"; //Gibt alles ab dem 12. Zeichen aus
echo substr($text, strlen($text)-15)."<br />"; //Gibt die letzten 15 Zeichen aus
?>

In der letzten Zeile haben wir die Länge des Textes bestimmt mittels der Funktion strlen($text) . Davon haben wir dann die Zahl 15 abgezogen und geben so die letzten 15 Zeichen des Textes aus. Dies geht auch etwas einfacher, indem ein negativer Wert für $start angegeben wird. Dann wird vom Ende des Textes aus gezählt. Ebenfalls kann der Wert $laenge negativ sein, dann wird bis zum Ende des Textes ausgeben:

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
echo substr($text, strlen($text)-15)."<br />"; //Gibt die letzten 15 Zeichen aus
echo substr($text, -15)."<br />"; //Gibt die letzten 15 Zeichen aus

echo substr($text, -20, 10)."<br />"; //Gibt 10 Zeichen zurück, beginnt 20 Zeichen vor Textende

echo substr($text, 5, -10)."<br />"; //Gibt alle Zeichen von Position 5 bis 10 Zeichen vor dem Ende zurück
echo substr($text, -25, -10)."<br />"; //Gibt alle Zeichen von 25 Zeichen vor dem Ende bis 10 Zeichen vor dem Ende zurück
?>

Als kleine Übung wollen wir nun mittels strpos() nach einen String suchen und dann die 10 Zeichen davor und danach ausgeben. Dies geht wie folgt:

<?php
$text = "Dies ist ein kleines Beispiel zum Durchsuchen. Eine andere Möglichkeit lernen wir später.";
$suchwort = "Beispiel";
$position = strpos($text, $suchwort);

if($position === false) {
   echo "Suchwort wurde nicht gefunden";
} else {
   $start_position = max(0, $position-10);
   $laenge = strlen($suchwort)+10+10;
   echo substr($text, $start_position, $laenge);
}
?>

Dies ist zugeben schon etwas komplizierter. Falls strpos false zurückgibt, geben wir eine Meldung aus, dass das Suchwort nicht gefunden wurde. Andernfalls berechnen wir zuerst die Startposition für die Ausgabe. Wir wollen ja die 10 Zeichen vor dem Suchwort ausgeben. Damit wir sicher gehen dass wir keine negative Startposition erhalten, beispielsweise wenn das Suchwortwert unter den ersten 10 Zeichen ist, nutzen wir noch die max() Funktion. Sollte also $position-10 negativ werden, setzen wir als Startwert eine 0.
Die Länge der Ausgabe ergibt sich aus der Länge des Suchworts, plus 10 Zeichen jeweils vor dem Suchwort und 10 Zeichen nach dem Suchwort. Zum Schluss geben wir mittels substr() entsprechend den Text vor und nach dem Suchwort aus.

Einfaches Ersetzen

Der einfachste Befehl dafür lautet: str_replace("Suchen", "Ersetzen", $variable) .

Ein Beispiel:

<?php
$text = "Dies ist ein kleines Beispiel";
$text = str_replace("ist", "war", $text);
echo $text;
?>

Mit str_replace ersetzen wir ist durch war in der Variable $text und speichern dies wieder in der Variable $text.

Wichtig zu wissen ist, dass str_replace zwischen Groß- und Kleinschreibung unterscheidet. Möchten wir ein Wort ersetzen unabhänig ob es groß- oder kleingeschrieben ist, können wir str_ireplace() verwenden:

<?php
$text = "Ersetze Peter und peteR durch ein anderes Wort";
$text = str_ireplace("Peter", "Max", $text);
echo $text;
?>

Hier werden sowohl Peter als auch peteR durch das Wort Max ersetzt.

Zu beachten ist bei str_replace() / str_ireplace(), dass Wortgrenzen nicht berücksichtigt werden. Es ist also völlig egal im Text wo der Suchstring auftaucht, ob am Wortanfang, in der Wortmitte oder am Wortende. Sobald eine Übereinstimmung vorliegt, wird der Text entsprechend ersetzt. Dies kann von Vorteil sein, beispielsweise wenn man ein ä überall im Text durch ein ae ersetzen möchte. Möchte man aber beispielsweise das Wort er durch sie ersetzen, kann dies komische Nebeneffekte haben:

<?php
$text = "Wer war an der Tür? Peter und er hatte Beeren dabei.";
$text = str_replace("er", "sie", $text);
echo $text; //Ausgabe: Wsie war an dsie Tür? Petsie und sie hatte Besieen dabei.
?>

Eine Möglichkeit dieses Problem zu umgehen ist zu überprüfen, dass er wirklich ein alleinstehendes Wort ist, d.h. wir überprüfen zusätzlich noch, dass Leerzeichen vor und hinter dem Wort stehen. Hierbei dürfen wir nicht vergessen, entsprechende Leerzeichen im neuen Text hinzuzufügen:

<?php
$text = "Wer war an der Tür? Peter und er hatte Beeren dabei.";
$text = str_replace(" er ", " sie ", $text);
echo $text; //Ausgabe: Wer war an der Tür? Peter und sie hatte Beeren dabei.
?>

Mehrere Ersetzungen gleichzeitig

Möchte man mehrere Ausdrücke auf einmal ersetzen, kann man natürlich mehrere str_replace-Funktionen hintereinander anwenden. Oder aber man übergibt statt Strings einfach Arrays, die die mehreren Ersetzungen definieren. Hierzu ein Beispiel:

<?php
$text= "Sie sollten täglich Früchte, Gemüse und Ballaststoffe essen.";
$gesund = array("Früchte", "Gemüse", "Ballaststoffe");
$lecker = array("Pizza", "Bier", "Eiscreme");

$new_text = str_replace($gesund, $lecker, $text); 
echo $new_text; //Sie sollten täglich Pizza, Bier und Eiscreme essen.
?>

Zeilenumbrüche ersetzen

Um einen Zeilenumbruch in HTML zu erhalten, reicht es ja bekanntlich nicht aus, die Enter-Taste zu drücken, sondern wir erreichen dies mittels dem Befehl <br />. Nun kommt es oft vor, dass wir Zeilenumbrüche von Benutzereingaben in entsprechende HTML-Zeilenumbrüche umwandeln wollen. Dies geht entweder mit der zuvor gelernten str_replace() Funktion oder mittels der nl2br($text) (Abkürzung für new line too break) . Hierzu ein kleines Beispiel. Auf der ersten Seite gibt der Benutzer in einer textarea Text ein, danach geben wir den Text entsprechend aus:

seite2.php:

Probiere es ruhig mit verschiedenen Eingaben aus. Der sauberste Stil um Zeilenumbrüche zu HTML-Zeilenumbrüchen umzuwandeln ist es, die Funktion nl2br() zu verwenden.

Autor: