PHP:PCRE:preg_match_all wind';t匹配模式中的转义美元符号($)
我正在尝试匹配$content内子字符串“${foo}”的所有实例。出于某种原因,我可以匹配{foo},但不能匹配${foo}。有人知道为什么吗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="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}
(且开头括号应足够)。但是这不是一个错误。您仍然需要对$
进行双转义。只有正则表达式特殊字符需要在单引号中转义。仅当需要在正则表达式中插入变量值时(在这种情况下,可能需要额外的转义符,如本例所示),才在正则表达式中使用双引号。或者使用反斜杠或单引号。是的,完全正确,只有那些字符。您仍然需要双转义$
。只有正则表达式特殊字符需要在单引号中转义。只有在需要向正则表达式中插入变量值时(在这种情况下,可能需要像本例所指出的那样进行额外的转义),才能在正则表达式中使用双引号。或者使用反斜杠或单引号。是的,确切地说,只使用这些字符。