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));
}