Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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 preg_match():编译失败:缺少包含转义字符的字符类的终止]\_Php_Json_Regex_Compiler Warnings - Fatal编程技术网

Php preg_match():编译失败:缺少包含转义字符的字符类的终止]\

Php preg_match():编译失败:缺少包含转义字符的字符类的终止]\,php,json,regex,compiler-warnings,Php,Json,Regex,Compiler Warnings,我试图在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"}] 我已在以

我试图在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"}]
我已在以下位置测试了以下正则表达式:

以下是我在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;
}
我收到的问题是,当我运行此页面时,我收到此错误

警告:preg_match():编译失败:缺少的终止] 中偏移量202处的字符类 第1422行的路径\到\ file/my-file.php

第1422行是上述代码段的第6行。我相信这是指向我的正则表达式末尾附近的
[^“\\]
,但是在转义的
\
之后有一个终止的
]

您可以使用此部分查看错误:

[^"\\]
需要:

[^"\\\\]
您需要再次将反斜杠加倍,因为它们在字符串和正则表达式语法中都充当转义符。
\
发送到
preg\u match
时会变成
\
,这是对
]
的转义,而不是将反斜杠作为字符集中的一个字符处理。

此部分:

[^"\\]
需要:

[^"\\\\]

您需要再次将反斜杠加倍,因为它们在字符串和正则表达式语法中都充当转义符。
\
在发送到
preg\u match
时变为
\
,这是对
]
进行转义,而不是将反斜杠作为字符集中的字符之一。

的第一次检查ode>v缺少一个开口
[

"v":"0-9]{1,3}"  // should be:
"v":"[0-9]{1,3}"

v
的第一次检查缺少一个开口
[

"v":"0-9]{1,3}"  // should be:
"v":"[0-9]{1,3}"

添加到@Barmar的答案,或将正则表达式包装为以下格式:


$re=添加到@Barmar的答案中,或将正则表达式包装成以下格式:



$re=为什么要用regexp解析JSON,而不是使用
JSON\u decode()
?我想确保数据在解码之前符合我的预期。解码JSON然后验证内容会容易得多。更具体地说,我在WordPress插件中使用这段代码,并希望在公共端输出错误之前添加另一层验证,以防API wh的错误响应在检索JSON之前。解析JSON,检查
JSON\u last\u error
,然后遍历解析的对象/数组以验证数据,比将数据全部塞进一个正则表达式要容易得多。为什么要尝试使用正则表达式而不是使用
JSON\u decode()解析JSON
?我想确保数据在解码之前符合我的预期。解码JSON然后验证内容会容易得多。更具体地说,我在WordPress插件中使用这段代码,并希望在公共端输出错误之前添加另一层验证,以防API wh的错误响应在检索JSON之前。解析JSON,检查
JSON\u last\u error
,然后遍历解析的对象/数组来验证数据,比将其全部塞进一个正则表达式要容易得多。很抱歉,在我的问题中,我在复制/粘贴和格式化代码时出现了一些错误。这是
[
已准备就绪。请参阅编辑。此处没有必选项。单用右括号并不意味着正则表达式中有特殊字符。@revo否,但如果您试图匹配0-9范围内的1-3个字符,PECL将需要其中一个字符才能正常工作。否则,它将查找文本字符串“0-9”后跟1-3“]“字符。
PECL
PCRE
?@revo混淆了我的首字母缩写。你是对的,我是指PCRE。对不起!我很抱歉在我的问题中复制/粘贴和格式化我的代码时出现了一些错误。这是
[
已准备就绪。请参阅编辑。此处没有必输项。单靠右括号并不意味着正则表达式中有特殊字符。@revo否,但如果您试图匹配0-9范围内的1-3个字符,PECL将需要其中一个字符才能正常工作。否则,它将查找文本字符串“0-9”后跟1-3“]”字符。
PECL
PCRE
?@revo混淆了我的首字母缩写词。你是对的,我是说PCRE。对不起!谢谢。在将此修复应用于每个\\谢谢。在将此修复应用于每个\\