Я пытаюсь сопоставить все экземпляры подстроки ‘$ {foo}’ внутри $ content. Я могу сопоставить ‘{foo}’, но не ‘$ {foo}’ по какой-то причине. Кто-нибудь знает почему?
$content="aaaa\${foo}bbbb\n";
echo $content; // aaaa${foo}bbbb
// THIS WORKS AS EXPECTED: matches all instances of substring '{foo}'
$result = preg_match_all("/(\{\w+\})/", $content, $matches);
if ($result === false) { die("NOT OK!"); }
echo "NUMBER OF MATCHES: ", $result, "\n";
var_dump($matches);
// THIS DOESN'T WORK AS EXPECTED: doesn't match instances of substring '${foo}'
$result = preg_match_all("/(\$\{\w+\})/", $content, $matches);
if ($result === false) { die("NOT OK!"); }
echo "NUMBER OF MATCHES: ", $result, "\n";
var_dump($matches);
Вот вывод этого кода. Первая часть выводит 1 совпадение, как и ожидалось, тогда как вторая часть выводит 0 совпадений, но я ожидал 1 совпадение:
aaaa${foo}bbbb
NUMBER OF MATCHES: 1
array(2) {
[0]=>
array(1) {
[0]=>
string(5) "{foo}"}
[1]=>
array(1) {
[0]=>
string(5) "{foo}"}
}
NUMBER OF MATCHES: 0
array(2) {
[0]=>
array(0) {
}
[1]=>
array(0) {
}
}
Благодарю.
Вы должны дважды убрать обратную косую черту (и вы должны также убрать двойные скобки).
"/(\\$\\{\w+\\})/"
Это потому, что вам нужно экранировать обратную косую черту для парсера строк, так как \\
станет \
до того, как PCRE даже увидит строку. Без двойного побега PCRE просто получит $
, который, очевидно, будет пытаться соответствовать концу строки.
Используйте одинарные кавычки, чтобы избежать двойного экранирования знака $. Только специальные символы регулярного выражения должны быть экранированы при использовании в регулярном выражении в одинарных кавычках, кроме обратной косой черты и одинарных кавычек, которые необходимо экранировать в любой строке PHP, заключенной в одинарные кавычки. При использовании регулярных выражений используйте двойные кавычки только тогда, когда вам нужно встроить переменную в ваше регулярное выражение (в этом случае другие символы, возможно, придется экранировать, а другие ответы демонстрируют).
Отсюда следующие работы:
$content="aaaa\${foo}bbbb\n";
echo $content; // aaaa${foo}bbbb
// THIS WORKS AS EXPECTED: matches all instances of substring '{foo}'
$result = preg_match_all('/(\{\w+\})/', $content, $matches);
if ($result === false) { die("NOT OK!"); }
echo "NUMBER OF MATCHES: ", $result, "\n";
var_dump($matches);
// THIS ALSO WORKS AS EXPECTED: matches all instances of substring '${foo}'
$result = preg_match_all('/(\$\{\w+\})/', $content, $matches);
if ($result === false) { die("NOT OK!"); }
echo "NUMBER OF MATCHES: ", $result, "\n";
var_dump($matches);
Используйте одинарные кавычки на вашем шаблоне.
Пример:
$pattern = '/(AUTH|PENALTY|(?:\$LINE))/i';
$DETTYPE_VALUE = array_filter($data, function($a) use($pattern) {
return preg_match_all($pattern, $a['fine']);
});