избежать $ 0, $ 1, .. с preg_replace - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть что-то похожее на это:

<?php
$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test $0';

$text = preg_replace($pattern, $value, $text);
?>

Я хочу, чтобы конечное значение $ text было 'test $ 0 ipsum'.Проблема в том, что $ 0 интерпретируется как переменная и заменяется на 'lorem', поэтому я получаю 'test lorem ipsum'.

Есть ли способ отключить эту функцию preg_replace ()?

Приведенный выше пример, конечно, упрощен.На самом деле я делаю создание шаблонного сценария, в котором я заменяю заполнители содержимым файла, которое может быть javascript, html и т. Д. Так что было бы здорово действовать на саму функцию preg_replace, а не заставлять изменять всеубедитесь, что в них есть экранирующие символы.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Используйте preg_quote , это правильный инструмент для этой манипуляции:

$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test $0';
$text = preg_replace($pattern, preg_quote($value), $text);
echo $text;

Вывод:

test $0 ipsum
0 голосов
/ 02 декабря 2018

Вы можете preg_replace с экранированием для любой обратной ссылки в заменяющем значении:

<?php
$text = 'lorem ipsum';
$pattern = '/lorem/';
$value = 'test $0';
echo preg_replace($pattern, preg_replace('/\$(\d+)/', '\\\$$1', $value), $text);

\$(\d+) ищет любые $, а затем одно или несколько чисел\\\$$1 заменяет $ на \$, потому что первый \\ экранирует обратную косую черту, чтобы быть буквальным для PHP.$1 является первой группой захвата, которая является числом (номерами).

https://3v4l.org/J8aps

...