Chance
Themenersteller
Programmierer
Guru (173 Beiträge)

Regulärer Ausdruck: Euro Zeichen ersetzen

am 29.05.2012, 08:41 Uhr eröffnete Chance folgenden Thread
PHP & MySQL    2740 mal gelesen    4 Antwort(en).

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"


willmann
Avatar willmann
TYPO3-Freelancer.
Guru (246 Beiträge)
am 29.05.2012, 12:17 Uhr schrieb willmann

Chance 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?


Marc Willmann. TYPO3-Freelancer.
http://www.marc-willmann.de

behalx
Avatar behalx
Fortgeschrittener (61 Beiträge)
am 01.08.2013, 11:47 Uhr schrieb behalx

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/

joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 01.08.2013, 18:02 Uhr schrieb joerg

Hallo

de.wikipedia.org/wiki/Meuro



Echt schon bewunderswert wie sehr man sich auf dieses einfache Teil stürzt.

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

behalx
Avatar behalx
Fortgeschrittener (61 Beiträge)
am 01.08.2013, 18:25 Uhr schrieb behalx

/(€|\\bEuro\\b)/i

?


http://unics.bplaced.net/

  • 1


« zurück zu: PHP & MySQL

Das Seitenreport Forum hat aktuell 5276 Themen und 36111 Beiträge.
Insgesamt sind 48364 Mitglieder registriert.