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
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
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 ^^
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!
|
|