preg_match():编译失败:缺少字符 class 的终止 ] 并转义了 \
preg_match(): Compilation failed: missing terminating ] for character class with escaped \
我正在尝试 运行 JSON 字符串上的正则表达式来验证数据是否符合预期,然后再继续我的脚本。
下面是 JSON 到 运行 正则表达式的示例:
[{"id":"01001001","b":"1","c":"1","v":"1","t":"Some \"Text\""},{"id":"01001002","b":"1","c":"1","v":"2","t":"More Text"},{"id":"01001003","b":"1","c":"1","v":"3","t":"And Even More"}]
我已经测试了以下正则表达式在 phpliveregex.com 上的工作情况:
\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]
以下是我在 PHP 中的组合方式:
$sv = '01001001';
$ev = '01001003';
$url = 'http://api.amasterdesigns.com/?sv='.$sv.'&ev='.$ev;
$JSON = file_get_contents($url);
//return JSON only if properly formatted
if(preg_match('/\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]/',$JSON)){
return json_decode($JSON);
} else {
return;
}
我遇到的问题是当我 运行 这个页面时我收到这个错误
Warning: preg_match(): Compilation failed: missing terminating ] for
character class at offset 202 in
path_to_file/my-file.php on line 1422
第 1422 行是上述代码片段的第 6 行。我相信这是指向正则表达式末尾附近的 [^"\]
,但在转义的 \
.
之后我确实有一个终止 ]
您可以使用 PHP sandbox
查看错误
这部分:
[^"\]
需要:
[^"\\]
您需要再次将反斜杠加倍,因为它们在字符串和正则表达式语法中都充当转义符。 \
在发送到 preg_match
时变成 \
,这是转义 ]
而不是将反斜杠视为字符集中的字符之一。
对 v
的第一次检查缺少空缺 [
:
"v":"0-9]{1,3}" // should be:
"v":"[0-9]{1,3}"
添加到@Barmar 的答案,或将您的正则表达式包装成 nowdoc 格式:
$re = <<< 'RE'
/\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]/
RE;
if (preg_match($re, $JSON)) {
print_r(json_decode($JSON));
}
我正在尝试 运行 JSON 字符串上的正则表达式来验证数据是否符合预期,然后再继续我的脚本。
下面是 JSON 到 运行 正则表达式的示例:
[{"id":"01001001","b":"1","c":"1","v":"1","t":"Some \"Text\""},{"id":"01001002","b":"1","c":"1","v":"2","t":"More Text"},{"id":"01001003","b":"1","c":"1","v":"3","t":"And Even More"}]
我已经测试了以下正则表达式在 phpliveregex.com 上的工作情况:
\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]
以下是我在 PHP 中的组合方式:
$sv = '01001001';
$ev = '01001003';
$url = 'http://api.amasterdesigns.com/?sv='.$sv.'&ev='.$ev;
$JSON = file_get_contents($url);
//return JSON only if properly formatted
if(preg_match('/\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]/',$JSON)){
return json_decode($JSON);
} else {
return;
}
我遇到的问题是当我 运行 这个页面时我收到这个错误
Warning: preg_match(): Compilation failed: missing terminating ] for character class at offset 202 in path_to_file/my-file.php on line 1422
第 1422 行是上述代码片段的第 6 行。我相信这是指向正则表达式末尾附近的 [^"\]
,但在转义的 \
.
]
您可以使用 PHP sandbox
查看错误这部分:
[^"\]
需要:
[^"\\]
您需要再次将反斜杠加倍,因为它们在字符串和正则表达式语法中都充当转义符。 \
在发送到 preg_match
时变成 \
,这是转义 ]
而不是将反斜杠视为字符集中的字符之一。
对 v
的第一次检查缺少空缺 [
:
"v":"0-9]{1,3}" // should be:
"v":"[0-9]{1,3}"
添加到@Barmar 的答案,或将您的正则表达式包装成 nowdoc 格式:
$re = <<< 'RE'
/\[(\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})(,\{"id":"[0-9]{8}","b":"[0-9]{1,2}","c":"[0-9]{1,2}","v":"[0-9]{1,3}","t":"[^"\]*(?:\.[^"\]*)*"\})*\]/
RE;
if (preg_match($re, $JSON)) {
print_r(json_decode($JSON));
}