PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP und regexp



idefix
26-09-2005, 12:38
Hi,

ich habe den folgenden String: "foo\\bar"
Jetzt möchte ich die "\\" durch ein "/" ersetzen.

Das habe ich mit der folgenden regexp versucht, allerdings will es einfach nicht und ich weiss leider nicht wieso:


$path="foo\\bar";
$newpath=preg_replace('/\\+/','/',$path);

Hat hier jemand einen Tip für mich?

idefix
26-09-2005, 13:39
Die folgende Zeile macht es, aber ich verstehe das nicht:


$newpath=preg_replace('/\\\+/','/',$path);

BLUESCREEN3D
26-09-2005, 19:24
ich habe den folgenden String: "foo\\bar"
Jetzt möchte ich die "\\" durch ein "/" ersetzen.
Für sowas einfaches benutzt man str_replace() und keine regulären Ausdrücke :D


Das habe ich mit der folgenden regexp versucht, allerdings will es einfach nicht und ich weiss leider nicht wieso:


$path="foo\\bar";
$newpath=preg_replace('/\\+/','/',$path);

Das funktioniert wahrscheinlich nicht, weil da irgendwas escaped wird.
Warum ist da überhaupt ein + hinter? Du willst doch nur einzelne \\ ersetzen...

undefined
26-09-2005, 21:19
Hi,

ich habe den folgenden String: "foo\\bar"
Jetzt möchte ich die "\\" durch ein "/" ersetzen.

Das habe ich mit der folgenden regexp versucht, allerdings will es einfach nicht und ich weiss leider nicht wieso:


$path="foo\\bar";
$newpath=preg_replace('/\\+/','/',$path);

Hat hier jemand einen Tip für mich?
Das kann nicht gehen ;)
Du musst jeden backslash durch seinen eigenen BackSlash escapen weil es ein Metazeichen ist - oder mit Zuweisungs Operatoren Arbeiten ;)


$path = "\pfad\\\zu\pfad"; ## das gilt hier auch ;)
echo preg_replace( "/\\\\{2}/", "#", $path );

BLUESCREEN3D
26-09-2005, 21:26
Das kann nicht gehen ;)
Du musst jeden backslash durch seinen eigenen BackSlash escapen weil es ein Metazeichen ist - oder mit Zuweisungs Operatoren Arbeiten ;)
Gerade dann müsste sein Code funktionieren:
Das erste Backslash escaped das zweite und dahinter folgt ein normales Plus als Operator.

Aber es scheint ja genau so nicht zu gehen...

edit: Das mit der Pfadangabe stimmt natürlich. Aber wenn er zwei Backslashes haben will, dann muss er vier eintippen und nicht drei O.o

edit2: Ich hasse diese Eigenarten von PHP - es geht auch mit drei Backslashes, weil der Interpreter \d nicht zu d macht :/

Deshalb funzt aber der reguläre Audruck mit \\\+ weil die ersten beiden Backslashes zu einem werden und das dritte nicht als Escape-Zeichen angesehen wird, da dahinter kein "escapewürdiges" Zeichen folgt

edit3: Kann alles nicht sein und nun bin ich auch verwirrt:
Folgendes: preg_replace("/\\/","/",$path);
ergibt die Fehlermeldung "Warning: No ending delimiter '/' found"
Das heißt, die beiden Backslashes escapen das Slash dahinter!?

edit4: Wohl die Lösung des Problems:
Im Suchbegriff für den Regulären Ausdruck muss man alles doppelt escapen - warum auch immer...

Der von idefix gesuchte reguläre Ausdruck ist also
$newpath=preg_replace('/\\\\+/','/',$path);
Aber das Plus macht da noch immer keinen Sinn ^^

edit5: Es sei denn es sollten unnötige, aufeinanderfolgende Backslashes (z.B. in der Pfadangabe foo\\\\\\\\\\\\\\\\\\\\bar) gleich weggekürzt werden, aber dann wäre die Frage schlecht gestellt gewesen.

Was ich bei edit2 geschrieben habe kann aber auch nicht so sein, weil es manchmal schon sinnvoll sein kann, ein Plus zu escapen. Also funktioniert das ganze so, dass die drei Backslashes da wie vier Backslashes interpretiert werden.

Romanday
26-09-2005, 21:41
Gerade dann müsste sein Code funktionieren:
Das erste Backslash escaped das zweite und dahinter folgt ein normales Plus als Operator.

Aber es scheint ja genau so nicht zu gehen...

edit: Das mit der Pfadangabe stimmt natürlich. Aber wenn er zwei Backslashes haben will, dann muss er vier eintippen und nicht drei O.o

edit2: Ich hasse diese Eigenarten von PHP - es geht auch mit drei Backslashes, weil der Interpreter \d nicht zu d macht :/

Deshalb funzt aber der reguläre Audruck mit \\\+ weil die ersten beiden Backslashes zu einem werden und das dritte nicht als Escape-Zeichen angesehen wird, da dahinter kein "escapewürdiges" Zeichen folgt


Jetzt hat er es immer noch nicht verstanden ^^.:D:rolleyes:

Pingu
26-09-2005, 21:57
@Bluescreen3D
Das hängt auch noch davon ab, ob man ein Einzelhochkomma (') oder ein Doppelhochkomma (') verwendet (siehe Doku: http://de2.php.net/string ).

Pingu

BLUESCREEN3D
26-09-2005, 21:58
Jetzt hat er es immer noch nicht verstanden ^^.:D:rolleyes:
Ich hab meinen Post noch ein paarmal editiert XD


@Bluescreen3D
Das hängt auch noch davon ab, ob man ein Einzelhochkomma (') oder ein Doppelhochkomma (') verwendet (siehe Doku: http://de2.php.net/string ).

Pingu
Eigentlich kann es daran nicht liegen, weil man bei den regulären Ausdrücken ein + auch innerhalb von einzelnen Hochkommata escapen kann.

idefix
26-09-2005, 23:30
Hi,

danke für die vielen Antworten, also ich will noch mal ganz kurz beschreiben, was passieren soll.
Ich habe die Zeichenkette:
foo\\bar\\foo2\\bar2
Die soll in die Zeichenkette:
foo/bar/foo2/bar2
umgewandelt werden.

Was ich halt zuerst dachte ist, \ ist ja ein Sonderzeichen (oder besser ein escape-Zeichen), also muss ich es escapen, \\ macht dann Sinn, jetzt kommt das Zeichen mehrmals vor, also kommt ein + dahinter. Deswegen dachte ich \\+ sollte eichentlich dem entsprechen.
Ich werde morgen noch ein paar Tests machen, vielleicht geht ja auch sowas wie \\{1,}

Naja, ich komme halt von Perl, deswegen hat mich das komische Verhalten von PHP hier ein bischen verunsichert, aber jetzt geht es ja. :)

Es ist mir klar, das \\\\ auch gehen sollte, aber wenn ich z.B. den String:
foo\\\bar
habe, klappt das nicht mehr :)
Deswegen ja der regexp, dem das dann vollkommen egal sein sollte.

BLUESCREEN3D
27-09-2005, 00:16
jetzt kommt das Zeichen mehrmals vor, also kommt ein + dahinter.
Das Plus brauchst du nur, wenn mehrere direkt hintereinander vorkommende Backslashes durch ein einziges Slash ersetzt werden sollen.

undefined
27-09-2005, 07:34
Du hast mein Posting nicht richtig gelesen. Dein String - den du übergibst wird als Backslash String angesehen. Daher musst du diesen String - der übergeben wird ebenfalls erst noch mal escapen sonst geht das nicht! Siehe meinen Kommentar in meinem ersten Post ;)
Wenn du also einen String mit:

\aha\und\\weiter
Übergibst must du genauso wie im Regexp die Backslashes erst Escapen sonst kann der Regexp nichts damit anfangen ;)

Rein Theoretisch reicht somit stripslashes() aus ;)

idefix
27-09-2005, 12:37
Nein, ich setze den String nicht in PHP, das habe ich hier nur gemacht um klar zu machen, welchen Ausgangsstring ich habe, der String im Originalprogramm kommt aus einer Datenbank.

undefined
27-09-2005, 15:39
Was Nein ? - Meinst du jetzt das stripslashes() nicht geht oder was?
Wenn dies der Fall ist dann stellen sich Folgende fragen.
Welche MySQL Version wenn >= 4.0 dann welcher Charset?
Wenn utf8 ist dein Script auch in utf8 ?
Ist in in der php.ini zufällig magic_quotes_gpc oder magic_quotes_runtime auf On? Wie schreibst du in in die Datenbank Textplain oder Quotest du?
mfg undefined

idefix
28-09-2005, 09:19
Was Nein ? - Meinst du jetzt das stripslashes() nicht geht oder was?

Damit beziehe ich mich darauf, das ich die Daten aus einer DB bekomme un nicht in PHP setze.


Wie schreibst du in in die Datenbank Textplain oder Quotest du?

Die Daten schreibt ein C++ Programm in die Datenbank und das macht es als Textplain.

Ich verstehe aber jetzt deine ganzen Fragen nicht, da sich meine eigentlich Frage nur darauf bezogen hat, wieso ich ein \ zweimal escapen muss also mit \\\.

Aber trotz allem habe ich hier wieder ein paar neue Befehle kennengelernt. :D
Danke noch mal an alle.