Regulärer Ausdruck: Euro Zeichen ersetzen
Redaktionelle Einordnung
Diese archivierte Diskussion behandelt Regulärer Ausdruck: Euro Zeichen ersetzen aus Sicht der Rubrik PHP & MySQL.
CMS- und Technikfragen sind heute besonders dann relevant, wenn sie Indexierung, Rendering, interne Verlinkung oder Relaunch-Risiken beeinflussen.
Sinnvoll nutzbar bleibt der Thread vor allem als historischer Kontext, für typische Fragestellungen und zur Einordnung älterer Empfehlungen.
Einige im historischen Thread genannte Tools, Dienste oder externe Links könnten heute nicht mehr verfügbar oder inhaltlich überholt sein. Nutzen Sie sie bitte nur mit zusätzlicher Prüfung.
Startbeitrag
Originaler Foreninhalt in modernisierter Darstellung.
Hi,
ich hänge mal wieder an Regulären Ausdrücken fest...
Ich will Euro als Währung in das Euro Zeichen umwandeln, d.h. erstmal in das Entinity.
Dazu benutze ich preg_replace, und bekomme es z.T. auch hin mit dem Ausdruck:
(€|Euro[^a-z])
Allerding bezieht es den ersten Punkt und das erste Leerzeichen mit ein.
Und am Zeilenende funktioniert es nicht.
String:
"In Europa unbegrenzt, weltweit bis zu fünf Jahre Euro Euro... Euro. Euro . €. € . Euro"
Antworten
4 BeiträgeChance schrieb:
Hi,
ich hänge mal wieder an Regulären Ausdrücken fest...
Ich will Euro als Währung in das Euro Zeichen umwandeln, d.h. erstmal in das Entinity.
Dazu benutze ich preg_replace, und bekomme es z.T. auch hin mit dem Ausdruck:
(€|Euro[^a-z])
Allerding bezieht es den ersten Punkt und das erste Leerzeichen mit ein.
Und am Zeilenende funktioniert es nicht.
String:
"In Europa unbegrenzt, weltweit bis zu fünf Jahre Euro Euro... Euro. Euro . €. € . Euro"
wie genau ist Dein Ursprungsstring und welches Ergebnis willst Du erreichen?
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.
Hallo
Echt schon bewunderswert wie sehr man sich auf dieses einfache Teil stürzt.
Gruß
Jörg
/(€|\\bEuro\\b)/i
?