preg_replace() непонятка

berkut

Новичок
preg_replace() непонятка

Столкнулся с не понятной проблемой:
PHP:
$tpl = 'one{repl}two';
$c = '$1234';
$tpl = preg_replace('#{repl}#i', $c, $tpl);
echo $tpl;
Ожидаю получить "one$1234two", а получаю "one34two"
вообщем preg_replace режет ещё и по такому типу:
preg_replace('#\$[^$]{,2}#', '', $String);

-~{}~ 19.05.06 22:20:

а, немного догоняю, он воспринимает $1 - как ссылку на найденое совпадение, но как избавиться от такого поведения?
 

SiMM

Новичок
PHP:
$c = '\\$1234';
Ибо в синтаксисе замены $ - ссылка на карман.
> но как избавиться от такого поведения?
Никак. Это же нормальное поведение. Единственный вариант - юзать слэши.
PS: пока искал в мануале, так ничего и не найдя, походу ты сам доперел до причины ;)
 

berkut

Новичок
preg_quote >> В регулярных выражениях служебными считаются следующие символы: . \\ + * ? [ ^ ] $ ( ) { } = ! < > | :

В preg_replace() во втором параметре, служебных символа только 2: $ и \\
так-что не подходит.
 

DiMA

php.spb.ru
Команда форума
если нельзя экранировать, то вместо дебатова быстрее заменить на другую строку или добавь лишние символы в середину), а потом результат еще разок назад
 

itprog

Cruftsman
berkut
ps: почему бы не использовать для такой замены [m]str_replace[/m]?
 

berkut

Новичок
itprog это упрощённый пример, просто я сразу не додумался, почему ак происходит. По-видимому, самое простое - preg_match_all -> foreach { str_replace }
 

SiMM

Новичок
> По-видимому, самое простое - preg_match_all -> foreach { str_replace }
А чем
PHP:
$tpl = preg_replace('#{repl}#i', strtr($c,array('\\'=>'\\\\','$'=>'\\$')), $tpl);
сложнее?
 
Сверху