Eine Lösung ist:
###
$string = "In Europa unbegrenzt, weltweit bis zu fünf Jahre Euro Euro... Euro. Euro . €. € . Euro";
echo preg_replace("/(€|Euro([^a-z]|$))/","€",$string);
###
Das Ergebnis:
---
In Europa unbegrenzt, weltweit bis zu fünf Jahre €€.. € €. €. € . €
---
Das Problem war, dass nach dem "Euro" der Teilausdruck "[^a-z]" folgte, der ja besagt, dass nach dem "Euro" irgendein Zeichen außer die Zeichen a-b (Kleinbuchstaben) folgen müssen ! Deswegen wird bei diesem String das letzte "Euro" nicht ersetzt, weil eben kein weiteres Zeichen folgt, sondern das String-Ende.
Durch "Euro([^a-z]|$)" lässt sich das zwar beheben: Anstatt eines Zeichen nach dem "Euro", darf auch das String-Ende folgen (|$), aber trotzdem gibt es zahlreiche Sonderfälle, die vermutlich nicht zum gewünschten Ergebnis führen.
Wenn wir z.B. folgenden String hätten:
###
$string = "Die Abgasnorm meines Autos lautet Euro4 und ich verkaufe ihn für 5000 euro. Es handelt sich bei diesem Auto um einen EuroP. Import.";
###
würde das Ergebnis:
---
Die Abgasnorm meines Autos lautet € und ich verkaufe ihn für 5000 euro. Es handelt sich bei diesem Auto um einen €. Import.
---
lauten. Problematisch ist vor allem der Ausdruck [^a-z], der ebenfalls alle Zahlen und sogar Großbuchstaben mit einschließt. Vermutlich wollte der Threadersteller damit ein Whitespace oder das Zeilenende darstellen. Außerdem gehe ich mal davon aus, das "euro" (kleingeschrieben) ebenfalls umgewandelt werden sollte.
Deswegen würde ich eher folgenden Ausdruck verwenden, der denke ich alle Fälle berücksichtigt:
echo preg_replace("/(€|Euro\\b)/i","€",$string);
Anstatt "([^a-z]|$)" verwendet man "\\b", also die Wortgrenze, das Punkt, Komma, Leerzeichen und Zeilenende miteinschließt, aber Groß- und Kleinbuchstaben oder Zahlen ignoriert.
Findet jemand ein String, der von diesem regulären Ausdruck nicht richtig ausgewertet wird. Ich meine nein.
http://unics.bplaced.net/
Beitrag erstellen
EinloggenKostenlos registrieren