2011-01-15 8 views
2

ich die unbekannt Modifikator Fehlermeldung erhalten, wenn das Muster Schrägstriche enthältpreg_replace Flucht schlitzt

Code:

preg_replace('/$v/', $replacement, $string) 


var $ v, manchmal ein Verzeichnispfad.

$v = folder/folder/file.ext 



Wie gehe ich mit dem $ v in preg_replace?

Antwort

4

Gerollt zurück zu meiner ursprünglichen Antwort, da das, was sich herausstellte zu arbeiten und Dany meine Antwort angenommen hat.

Flucht mit preg_quote() und doppelten Anführungszeichen verwenden, wenn es in einem String Abdrucken:

$v = preg_quote($v, '/'); 
echo preg_replace("/$v/", $replacement, $string); 

Dann wieder, wenn Ihr $v hat keine Regex Metazeichen, und Sie wollen einfach nur eine genaue Übereinstimmung zu tun verwenden Sie str_replace() statt:

echo str_replace($v, $replacement, $string); 
+0

@BoltClock: Ich glaube nicht, dass das ist, was ich will. Das Hinzufügen von Schrägstrichen ändert das Regex-Muster und ersetzt es nicht als Ergebnis. Auch die Variable enthält Regex-Zeichen – Zebra

+0

@dany: OK, also alles, was Sie wollen, ist die Flucht der '/' Zeichen, bin ich richtig? – BoltClock

+0

@BoltClock: Ich möchte nur das Muster ersetzen, das Schrägstriche enthält - mit einem Wert. Ex. von "ordner/ordner/ordner/datei" zu "foo" – Zebra

0

der richtige Weg, Strings für die Verwendung in regulären Ausdrücken zu entkommen ist preg_quote():

$v = preg_quote($v, '/'); 
preg_replace('/$v/', $replacement, $string) 

Es wird darauf geachtet, dass nicht nur das Trennzeichen /, sondern auch alle anderen Regex-Metazeichen wie Punkte oder Klammern oder andere Escape-Sequenzen erhalten werden.

2

Keine der vorhandenen Antworten ist absolut richtig.

Der richtige Weg PREG Symbole mit preg_replace() zu entkommen ist der folgende:

$delim = '~'; 
$search = preg_quote('folder/folder/file.ext', $delim); 
$replace = addcslashes($replace, '\\$'); 
//$replace = preg_quote($replace); // don't use $delim here! 

$string = preg_replace($delim . $search . $delim, $replace, $string); 

$replace muss auch entgangen sein, sonst $0 würde den gefundenen String zum Beispiel zurück.

+0

Danke für die Alternative! – Zebra

+1

Ich glaube nicht, dass 'preg_quote' universell geeignet ist, die Ersatzzeichenfolge zu umgehen. Ein einzelnes '.' wird zu' \ .' und der Preg_replace-Aufruf macht das Entweichen nicht rückgängig. - Es muss eine Escape-Funktion speziell für die Fälle "$ 0" und "\\ 1" geben. – mario

+0

@mario: Hat das aber nicht ...Ich denke, dass 'addcslashes ($ replace, '\\ $')' dann eine gute Lösung wäre. –