Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

[PHP] Regular Expressions

TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 16:08 Uhr
Zuletzt editiert am: 10.04.2007 um 16:59 Uhr

Hi, Ich hab ein kleines Problem mit Regular Expressions:

Ich wollte folgendes erreichen:
In einem String sollen alle "&" durch ein "&" ersetzt werden. Dabei gibt es jedoch eine Ausnahme: Wenn nach dem & ein #, eine Zahl und ein ; folgt (wie zum Beispiel © ) soll das entsprechende Zeichen (hier ein © ) dargestellt werden.

Bis jetzt mache ich das mit folgendem Code:

Zitat:

$orig = "/&(^#\d+;)/Ui";
$replace = "&\1";
$text = preg_replace($orig, $replace, $text);


Aber irgendwie will der Code nicht laufen... Ich habs auch schon mit

Zitat:

/&([^#\d+;])/Ui

versucht, aber dann schneidet er den ersten Buchstaben ab...

Würde mich freun wenn mir jemand helfen könnte

Gruß, Felix

Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 16:36 Uhr

Zitat von TheBrainless:


Zitat:

$orig = "/&(^#\d+;)/Ui";
$replace = "&\1";
$text = preg_replace($orig, $replace, $text);



Der Code macht so keinen Sinn, weil du alle Dinge auf die deine Regex matched wieder mit sich selbst ersetzt. Ich glaube nicht, dass das ist, was du willst ;-)
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 16:52 Uhr

was er macht wenn ich das ^ weglasse ist das er das & durch ein & ersetzt und das in der klammer dann dahinter hinzufügt... nur macht er dann halt das komplette gegenteil von dem was ich will: er ersetzt bei x das &...

wenn ich das \1 weglassen würde, hätte ich bei x nur ein & stehn, aber ich will ja, dass das #120; auch dabei bleibt ;-)

Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 16:54 Uhr

Schau bitte nochmal ob der Quelltext wie er im Forum angezeigt wird auch der ist, den du benutzt ;-)
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 17:00 Uhr

oke, überzeugt^^
das muss natürlich $replace = "&\1"; heißen^^

habs geändert...

Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 17:04 Uhr

Also es müßten wohl [ ] statt ( ) sein, aber die Negationen in Regex verwirren mich eh immer. Das i am Ende solltest du auf jeden Fall weglassen können.
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 17:20 Uhr

So, habs jetzt mal mit einem [ ] probiert... Jetzt macht der Code etwas ganz komisches O.o
Er ersetzt zwar wie gewollt das &, danach steht im Quellcode aber (laut Notepad++) das Sonderzeichen SOH und danach gehts ganz normal weiter.
Beispiel:
threadid=1&start=0 wird zu threadid=1&[SOH]tart=0
Wobei anstatt des [SOH] halt das Sonderzeichen  steht...
Ich weiß so langsam wieder warum ich Regular Expressions hasse :-D

Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 17:28 Uhr

Ok ganz anders:

"/&(?!#\d+;)/U"
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 17:39 Uhr

So, jetzt funktionierts zumindest soweit das alle Zeichen angehängt werden... Aber das SOH ist immer noch vorhanden O.o
Mich wunderts nur, dass das ? zwar in der PHP.net-Dokumentation als extra Unterpunkt aufgeführt wird, das ! aber nicht... aber hätte ich auch selbst drauf kommen können :autsch: ^^

Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 17:42 Uhr
Zuletzt editiert am: 10.04.2007 um 17:43 Uhr

Das PHP-Handbuch ist für Perl-RegEx auch nicht der richtige Anlaufpunkt ;-)
Das ist ein Link
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 17:57 Uhr
Zuletzt editiert am: 10.04.2007 um 20:50 Uhr

So, hab den Code nu doch zum laufen gebracht... Bei meinem ersten Code hab ich ja duch &\1 ersetzt... Das \1 wird aber ohne Klammer nicht gefüllt und sorgt für das überflüssige SOH-Zeichen... Ohne das SOH läuft es wie gewünscht =)
Und danke für den Link mit den Regular Expressions xD

Hier nochma der Code für alle die das gleiche Problem haben sollten:

Zitat:

$orig = "/&(?!#\d+;)/U";
$replace = "&";
$text = preg_replace($orig, $replace, $text);


Mörps mörps blubbs!

Nitek - 42
Champion (offline)

Dabei seit 01.2003
4129 Beiträge

Geschrieben am: 10.04.2007 um 18:52 Uhr

Du mußt in dem Fall eigentlich ( ) benutzen und nicht [ ]. Eckige Klammerin sind bei RegEx für die Character-Klassen und haben somit eine vollkommen andere Bedeutung.
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 10.04.2007 um 20:49 Uhr

ups, hätte doch nich den originalcode nehmen sollen und anpassen und einfügen sondern den direkt ausm quelltext^^
hast natürlich recht =)

Mörps mörps blubbs!

  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -