Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:PCRE:preg_match_all wind';t匹配模式中的转义美元符号($)_Php_Regex_Pcre - Fatal编程技术网

PHP:PCRE:preg_match_all wind';t匹配模式中的转义美元符号($)

PHP:PCRE:preg_match_all wind';t匹配模式中的转义美元符号($),php,regex,pcre,Php,Regex,Pcre,我正在尝试匹配$content内子字符串“${foo}”的所有实例。出于某种原因,我可以匹配{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+\})/", $co

我正在尝试匹配$content内子字符串“${foo}”的所有实例。出于某种原因,我可以匹配{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) {
  }
}

谢谢。

你需要双倍转义反斜杠(你也应该双倍转义大括号)


这是因为您需要为字符串解析器转义反斜杠,因为在PCRE看到字符串之前,
\\
将变成
\
。如果没有双转义,PCRE只会得到
$
,这显然会尝试匹配字符串的结尾。

您需要双转义反斜杠(并且还应该双转义大括号)


这是因为您需要为字符串解析器转义反斜杠,因为在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);

使用单引号,以避免双转义$符号。当在单引号中的正则表达式中使用时,只有正则表达式特殊字符需要转义,而反斜杠和单引号则需要在单引号中包含的任何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']);
});

在图案上使用单引号

例如:

$pattern = '/(AUTH|PENALTY|(?:\$LINE))/i';
$DETTYPE_VALUE = array_filter($data, function($a) use($pattern)  {
    return preg_match_all($pattern, $a['fine']);
});

使用双引号括起模式字符串时,必须两次转义
$
符号。一次是为了防止php解析器将
$
视为变量的开头,一次是为了转义特殊的正则字符
$
。如果只想转义一次,请使用单引号。简单地说,正则表达式使用单引号。这样可以省去你的麻烦。当你用双引号括起一个模式字符串时,你必须两次转义
$
符号。一次是为了防止php解析器将
$
视为变量的开头,一次是为了转义特殊的正则字符
$
。如果只想转义一次,请使用单引号。简单地说,正则表达式使用单引号。这会让你省去一点头痛。你不需要在大多数时候双倍地逃避这个大括号。仅当它是不明确的,如
{1,2}
{1}
(且开头括号应足够)。然而,这并不是一个错误。你不需要在大多数情况下对花括号进行双重转义。仅当它是不明确的,如
{1,2}
{1}
(且开头括号应足够)。但是这不是一个错误。您仍然需要对
$
进行双转义。只有正则表达式特殊字符需要在单引号中转义。仅当需要在正则表达式中插入变量值时(在这种情况下,可能需要额外的转义符,如本例所示),才在正则表达式中使用双引号。或者使用反斜杠或单引号。是的,完全正确,只有那些字符。您仍然需要双转义
$
。只有正则表达式特殊字符需要在单引号中转义。只有在需要向正则表达式中插入变量值时(在这种情况下,可能需要像本例所指出的那样进行额外的转义),才能在正则表达式中使用双引号。或者使用反斜杠或单引号。是的,确切地说,只使用这些字符。