2011-01-15 2 views
2

Я получаю ошибкунеизвестного модификатора, когда шаблон содержит слэшpreg_replace побег слэши

код:

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


вара $ v, иногда пути к каталогу.

$v = folder/folder/file.ext 



Как иметь дело с $ V в preg_replace?

ответ

4

Откат назад к моему первоначальному ответу, так как это то, что оказалось работать, и даны приняли мой ответ.

экранировать с preg_quote() и использовать двойные кавычки при размещении его в строке:

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

Затем снова, если ваш $v не имеют какие-либо регулярные выражения метасимволов, и вы просто хотите, чтобы сделать точное совпадение используйте str_replace() вместо:

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

@BoltClock: Я не думаю, что это то, что я хочу. Добавление косой черты изменяет шаблон регулярного выражения и не заменяет его в результате. Также переменная содержит символы регулярных выражений – Zebra

+0

@ dany: ОК, поэтому все, что вы хотите, это избежать символов '/', я прав? – BoltClock

+0

@BoltClock: Я просто хочу заменить шаблон, содержащий слэши, со значением. ех. из "папки/папки/папки/файла" в "foo" – Zebra

0

правильный способ избежать строки для использования в регулярных выражениях является preg_quote():

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

Устраняется утечка не только разделителя /, но и всех других метасимволов регулярных выражений, таких как точки или фигурные скобки или другие escape-последовательности.

2

Ни один из существующих ответов не является абсолютно правильным.

Правильный способ избежать символы PREG с preg_replace() заключается в следующем:

$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 также должен быть экранирован, иначе $0 бы вернуть найденную строку, например.

+0

Спасибо за альтернативу! – Zebra

+1

Я не думаю, что 'preg_quote' универсально подходит для экранирования строки замены. Единственный '.' станет' \ .', и вызов preg_replace не отменяет экранирование. - Для случаев '$ 0' и' \\ 1' должна быть функция экранирования. – mario

+0

@mario: Не правда ли, что ...Я думаю, что 'addcslashes ($ replace, '\\ $')' было бы хорошим решением. –

Смежные вопросы