Как избежать $ в PHP, используя preg_replace? - PullRequest
6 голосов
/ 20 апреля 2009

Я использую preg_replace для экранирования специальных символов:

$tmpStr=preg_replace("/\?/", "\?", $tmpStr);
$tmpStr=preg_replace("/\#/", "\#", $tmpStr);
$tmpStr=preg_replace("/\^/", "\^", $tmpStr);
$tmpStr=preg_replace("/\&/", "\&", $tmpStr);
$tmpStr=preg_replace("/\*/", "\*", $tmpStr);
$tmpStr=preg_replace("/\(/", "\(", $tmpStr);
$tmpStr=preg_replace("/\)/", "\)", $tmpStr);
$tmpStr=preg_replace("/\//", "\/", $tmpStr); 

Но я не могу сбежать $, используя ту же функцию:

$tmpStr=preg_replace("/\$/", "\$", $tmpStr);

А также, когда я использую приведенное выше утверждение, все пробелы заменяются на $, а $ не экранируется.

Как правильно избежать знака доллара?

Ответы [ 10 ]

12 голосов
/ 20 апреля 2009

Я настоятельно рекомендую использовать preg_quote () .

4 голосов
/ 23 августа 2011

Правильный ответ: вы должны экранировать обратную косую черту и знак доллара в регулярном выражении, используя escape-символы PHP.

backslash = \\
dollar sign = \$

$tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr);

Это полезно для всех, кому нужно сопоставить строку, содержащую знак доллара.

4 голосов
/ 20 апреля 2009

Знак $ должен быть экранирован сам по себе, поэтому

$tmpStr=preg_replace("/$$/", "\$", $tmpStr);

Я бы также посоветовал вместо добавить черту .

3 голосов
/ 22 мая 2010

Похоже, ваша проблема в том, чтобы сбежать. Одиночные кавычки (') в PHP работают иначе, чем двойные кавычки ("). Это очень похоже на Perl, где интерполяция переменных не происходит в одиночных кавычках, а знак доллара ($) не является метасимволом:

print "\$"; # prints $
print '\$'; # prints \$

Кроме того, классы символов Perl упростят ваш код:

$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
2 голосов
/ 01 ноября 2012

Да, похоже, что \\$ рассматривается PHP как $ в строке в двойных кавычках. Это означает, что вы должны заставить PHP увидеть \$, сказав \\\$.

Я только что попробовал preg_replace("/\\\$$k\\\$/", $v, $data), и это действительно работает (заменяет вхождения $KEY$ на VALUE.

0 голосов
/ 17 марта 2016
$pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern);
0 голосов
/ 12 июня 2015

Попробуйте addlashes ()?

Проверить php.net / addlashes ()

0 голосов
/ 03 февраля 2015

В PHP для конкретного случая «$», используемого в HTML, вы также можете сделать предыдущую замену для его сущности:

$tmpStr = str_replace('$', '$',$tmpStr);
0 голосов
/ 20 апреля 2009

не правда ли, что PHP видит \ $ как $? Я не проверял это, это может пойти так:

php стоит первым и заменяет ваш "/ \ $ /" на "/ $ /" тогда механизм preg делает свое дело ... к сожалению, $ является оператором регулярного выражения (я полагаю, он соответствует концу строки?), поэтому он не находит $ -символы в вашем тексте, но будет

Я думаю, что вам нужно сделать, это двукратно избежать символа $, вот так;

$ tmpStr = preg_replace ("/ \ $ /", "\ $", $ tmpStr);

Также .. в этом случае я бы просто использовал str_replace ()

0 голосов
/ 20 апреля 2009

IIRC вы заменяете $ на $. Так и должно быть $$

Вы также можете попробовать

$tmpStr=preg_replace('/\$/', '\$', $tmpStr);
...