phpBuddy

Tipps & Tricks

PHP Profis von morgen finden hier diverse Tipps & Tricks zu immer wiederkehrende Hürden beim programmieren. Darüber hinaus werden auch weniger bekannte Funktionen anhand von kleinen Beispielen erklärt.

Sie sind hier: Startseite Zeichen ersetzen
Zeichen und Sonderzeichen ersetzen

Zeichen und Sonderzeichen in einem String ersetzen

Sehr häufig muss man unerlaubte Zeichen und Sonderzeichen aus einem Text, Dateiname, o.ä. filtern. Dazu bietet PHP verschiedenen Wege an, die alle ihre Vor- und Nachteile haben. Für komplizierte Ersetzungen ist meistens RegEx (Regular Expressions - Reguläre Ausdrücke) mit den preg_* Funktionen die erste Wahl. Möchte man allerdings nur z.B. Umlaute umwandeln, wäre RegEx wie mit Kanonen auf Spatzen schießen.
PHP bietet hier aber noch weitere Möglichkeiten an, die wir uns kurz anschauen möchten.

Stellen wir uns vor, wir hätten ein kleines Script geschrieben das es Benutzern erlaubt Bilder hochzuladen (wie z.B. das Image Hosting Script). Natürlich ist es nur eine Frage der Zeit bis jemand eine Datei hochlädt, die all das beinhaltet, was absolute Todsünden im Web sind. So ein Dateiname könnte etwa wie folgt aussehen:

$text = 'schönes Haus an einer Bergstraße.jpg';

Hier wird einem alles geboten: Umlaute, Groß-/Kleinschreibung, Leerzeichen
Da sind Fehler vorprogrammiert. Also müssen wir Programmierer dafür sorgen, dass diese Fehler ausgebügelt werden.


Der schlechte Weg mit str_replace

Wenn man, wie wir in diesem Beispiel, mehrere Ersetzungen im selben String vornehmen muss, kann der Code mit str_replace schnell unübersichtlich werden.
str_replace nimmt die Zeichenkette und sucht nach dem zu ersetzenden Zeichen und tauscht dieses dann aus. Hat man mehrere Zeichen zu ersetzen, muss man die Funktion mehrfach aufrufen.

$text = strtolower( $text );
$text = str_replace( "ö", "oe", $text );
$text = str_replace( "ß", "ss", $text );
$text = str_replace( " ", "_", $text );
// usw. fuer jedes zu ersetzendes Zeichen
 
// Gibt aus: schoenes_haus_an_einer_bergstrasse.jpg
echo $text;

Das Ergebnis stimmt, aber falls wir 10 oder mehr Zeichen haben nach denen wir suchen müssen, bläht sich der Quelltext ganz schön auf.
str_replace kann aber glücklicherweise auch mit Arrays umgehen ...


Der gute Weg mit str_replace

Um sich eine Menge Quelltext zu ersparen, kann man an die Funktion str_replace auch 2 Arrays übergeben. Das erste Array enthält alle Zeichen nach denen gesucht werden soll, das zweite Array enthält alle Zeichen mit den Ersetzungen. Die Arrays müssen die gleiche Länge haben und korrespondieren über den Index. Das bedeutet, dass $suchen[0] mit $ersetzen[0], $suchen[1] mit $ersetzen[1], usw. ersetzt wird. Praktisch sieht das so aus:

$suchen   = array( 'ä', 'ö', 'ü', 'ß', ' ', '\\', '/' );
$ersetzen = array( 'ae', 'oe', 'ue', 'ss', '_', '-', '-' );
$text     = str_replace( $suchen, $ersetzen, strtolower( $text ) );
 
// Gibt aus: schoenes_haus_an_einer_bergstrasse.jpg
echo $text;

Man sieht sofort, dass sich der Quelltext deutlich reduziert hat. Ebenso ist es ein Leichtes, die Arrays um weitere Zeichen zu erweitern, ohne das sich der Code wesentlich vergrößert.
PHP hält aber noch eine weitere, weniger bekannte, aber sehr leistungsfähige Funktion bereit um mehrere Zeichen zu ersetzen ...


Der elegante Weg mit strtr

Die Funktion strtr wurde dafür geschaffen, mehrere Zeichen "in einem Aufwisch" zu ersetzen. Dazu kann man der Funktion ein assoziatives Array übergeben und strtr sucht dann nach $array_schluessel um den Treffer mit $array_wert zu ersetzen.

$ersetzen = array( 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', ' ' => '_', '\\' => '-', '/' => '-' );
$text = strtr( strtolower( $text ), $ersetzen );
 
// Gibt aus: schoenes_haus_an_einer_bergstrasse.jpg
echo $text;

Hier arbeitet man also nur mit einem Array, im Gegensatz zu str_replace, dass zwei Arrays erwartet und auch hier kann man das Array beliebig erweitern. Es gibt, neben dem eingesparten Quelltext, aber noch ein weiteres Argument, wieso man bei Mehrfach-Ersetzung auf strtr setzen sollte: es ist in den meisten Fällen 10% bis 20% schneller als str_replace!

Das heisst aber nicht, dass str_replace unnötig ist. Jede dieser Funktionen hat ihre Vor- und Nachteile.


Faustregel für Text ersetzen

Ersetzt man nur ein Zeichen durch ein anderes, ist str_replace die erste Wahl.

Möchte man mehrere Zeichen durch ein einzelnes Zeichen ersetzen (wie es z.B. in Gästebucher eingesetzt wird um böse Wörter durch * zu ersetzen), ist auch hier str_replace die beste Funktion.

Beim Ersetzen von mehreren Zeichen durch mehrere Zeichen ist strtr am besten geeignet.