Регулярное выражение в PHP, ожидающее совпадения со строками типа "$ {string}", не работает - PullRequest
2 голосов
/ 31 мая 2019

Я получил:

$ap=0;
$matches=array();
d($ap, $vv[$value],$matches);
$ap = preg_match("/\$[({].+[)}]/", $vv[$value], $matches);
d($ap, $vv[$value],$matches);

d() - это пользовательская функция, такая как var_dump().

Когда $vv[$value] равен "exec_prefix = $ {prefix}", почему $ap равен 0, и совпадений нет ($ совпадения по-прежнему пустой массив)?

Я ожидаю, что $ {prefix} "будет совпадать.

Я попробовал регулярное выражение в regexpal.com, и оно тоже совпадает.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

В своем регулярном выражении вы пытаетесь использовать $ в качестве маркера начала поля.Поскольку PHP требует экранирования $, в противном случае он будет думать, что вводит подстановку переменных (в двойных кавычках), и будет использовать \, который вы включили для этой цели.НО это тогда оставляет регулярное выражение как

/$[({].+[)}]/

, и это означает, что он будет использовать $ в качестве маркера конца строки - и, следовательно, не найдет содержимое после.

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

$ap = preg_match("/\\$[({].+[)}]/", $vv[$value], $matches);
1 голос
/ 31 мая 2019

«\» перед «$» удаляется до того, как он попадает в preg_match (), потому что он обрабатывается PHP как escape-символ для «$».

Чтобы исправить это, просто используйте вместо одинарных кавычекдвойной цитаты:

$ap = preg_match('/\$[({].+[)}]/', $vv[$value], $matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...