| Zeichen und Sonderzeichen ersetzen |
Zeichen und Sonderzeichen in einem String ersetzenSehr 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. 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 Der schlechte Weg mit str_replaceWenn man, wie wir in diesem Beispiel, mehrere Ersetzungen im selben String vornehmen muss, kann der Code mit str_replace schnell unübersichtlich werden. $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. Der gute Weg mit str_replaceUm 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. Der elegante Weg mit strtrDie 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 ersetzenErsetzt 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. |