(Regexp) Backslash
Franco
- php
0 seth_not@home0 Cheatah0 Franco
Hallo,
ich beschäftige mich seit einiger Zeit mit regexp und habe nun auch ein wenig herumprobiert.
Ich möchte nun aus einem String, der das Zeichen ' (also einfacher Anführungsstrich) mit einer beliebigen Anzahl (auch 0) vorangestellter Backslashes, durch ', also einfacher Anführungsstrich mit einem Backslash ersetzt.
Also z.B.:
'
\\'
'
\'
aus dem er immer ' machen soll.
Es können auch anderweitig Backslashes in dem String vorkommen, also einfach alle Backslashes zu löschen und dann vor die ' zu setzen ist auch keine Lösung.
Nun habe ich folgendes (PHP) versucht:
$new = preg_replace("#\*'#","'",$string);
Delimiter hierbei ist natürlich die Raute.
Ich habe das ganze auch mit einem einfachen, nicht-escapten Backslash versucht, und auch, das ganze in einfache Anführungszeichen zu setzen und dabei das einfache Anführungszeichen im Suchstring zu escapen.
Ergebnis ist immer das selbe: keines. Er macht entweder gar nichts und lässt alles, wie es ist, oder setzt den ganzen String auf "" - also nix.
Wo liegt denn hier mein Denkfehler - oder gibt es in diesem Fall etwas ganz spezielles zu beachten, das ich noch nicht weiss :-) ?
Vielen Dank,
Franco.
gudn tach!
$new = preg_replace("#\*'#","'",$string);
"#\*'#
wird zu zum regexp
#\*'#
somit wird der stern als literal betrachtet.
in php solltest du also
"#\\*'#"
schreiben.
prost
seth
Hallo seth,
"#\*'#
wird zu zum regexp
#\*'#
Das war mein Gedankengang :-)
somit wird der stern als literal betrachtet.
in php solltest du also
"#\\*'#"
schreiben.
OK, ich habe nicht bedacht, dass der Stern ja auch in dem Sinne ein Sonderzeichen, ein Quantifier ist. Hört sich dämlich an, da ich ihn ja als solchen verwende, ist aber so. Bin eben Anfänger und noch nicht so mit den Zeichen vertraut :-)
Jetzt funktioniert es auch.
Dankeschön für deine Hilfe :-)
Gruß, Franco.
Hi,
OK, ich habe nicht bedacht, dass der Stern ja auch in dem Sinne ein Sonderzeichen, ein Quantifier ist.
der Stern spielt überhaupt keine Rolle - den willst Du ja genau so verwenden, wie er gedacht ist. Ihn musst Du nicht escapen. Statt dessen gilt die allgemeingültige, *immer* zu beachtende Regel:
Wenn Du einen Wert in einen Kontext bringst, musst Du ihn kontextspezifisch kodieren.
Du willst also den Wert "" in den RegExp-Kontext bringen. Seine Kodierung dort lautet "\". Anschließend(!) willst Du diesen Wert in einen PHP-String-Kontext bringen. Jeder der beiden Backslashes ist dort ein zu kodierendes Sonderzeichen, so dass sich "\\" ergibt. Würde in RegExp mittel "§" und in PHP-Strings mittes "%" kodiert werden, wäre das Ergebnis "§%" oder "%§%", je nachdem ob "§" in PHP-Strings ein Sonderzeichen ist oder nicht.
Cheatah
Hi,
$new = preg_replace("#\*'#","'",$string);
Ergebnis ist immer das selbe: keines.
natürlich. Welche Zeichenkette wird durch den PHP-Code "'" repräsentiert? Welche Regular Expression steckt im String "#\*'#"?
Cheatah
Hallo Cheatah,
danke auch für deine Antwort.
Habe, wie schon in meinem anderen Beitrag erwähnt, nicht bedacht, dass der Stern ja eben ein Quantifier ist und somit in regexps auch escapebar.
Bin in regexp noch neu und habe bisher immer nur Anführungszeichen und r/n/t escaped :-)
Danke,
Franco.