Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.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中的JS对象文本字符串中提取一些数据_Php_Regex - Fatal编程技术网

使用正则表达式从PHP中的JS对象文本字符串中提取一些数据

使用正则表达式从PHP中的JS对象文本字符串中提取一些数据,php,regex,Php,Regex,我得到了一个由最初在web上刮取的Js对象文本组成的字符串转储,我需要在PHP中从中获取一些数据这些是无效的JSON,因此我无法使用JSON\u解码。它们的格式如下,其中的细节是我需要捕捉的 ...data: [DETAILS]... 在一些源代码中,数据元素多次出现,我需要捕获每个匹配项。详细信息可以包含任何字符,包括[{}]、引号和逗号,但我需要捕获所有字符 我正在尝试使用正则表达式。下面是我通过遵循一些教程所做的尝试,但肯定是错误的 preg_match_all('~(?:\G(?!^)

我得到了一个由最初在web上刮取的Js对象文本组成的字符串转储,我需要在PHP中从中获取一些数据这些是无效的JSON,因此我无法使用JSON\u解码。它们的格式如下,其中的细节是我需要捕捉的

...data: [DETAILS]...
在一些源代码中,数据元素多次出现,我需要捕获每个匹配项。详细信息可以包含任何字符,包括[{}]、引号和逗号,但我需要捕获所有字符

我正在尝试使用正则表达式。下面是我通过遵循一些教程所做的尝试,但肯定是错误的

preg_match_all('~(?:\G(?!^),|(data: )\{)\s+([^:]+): (\d+|"[^"]*")~', $html, $out, PREG_SET_ORDER) ? $out : []
拜托,我真的需要一些帮助

编辑:这只是一个数据字段的示例,显示了详细信息。它并不总是以这种形式出现

series:[{name:'Records',data:[[Date.parse('2013-11-01'),1],[Date.parse('2013-12-01'),2],[Date.parse('2014-01-01'),1],[Date.parse('2014-02-01'),4],[Date.parse('2014-03-01'),23],[Date.parse('2014-04-01'),22],[Date.parse('2014-05-01'),19],[Date.parse('2014-06-01'),26],[Date.parse('2014-07-01'),43],[Date.parse('2014-08-01'),29],[Date.parse('2014-09-01'),47],[Date.parse('2014-10-01'),31],[Date.parse('2014-11-01'),32],[Date.parse('2014-12-01'),17],[Date.parse('2015-01-01'),28],[Date.parse('2015-02-01'),2],[Date.parse('2015-03-01'),18],[Date.parse('2015-04-01'),16],[Date.parse('2015-05-01'),10],[Date.parse('2015-06-01'),25],[Date.parse('2015-07-01'),20],[Date.parse('2015-08-01'),21],[Date.parse('2015-09-01'),6],[Date.parse('2015-10-01'),10],[Date.parse('2015-11-01'),-11],[Date.parse('2015-12-01'),12],[Date.parse('2016-01-01'),46],[Date.parse('2016-02-01'),32],[Date.parse('2016-03-01'),16],[Date.parse('2016-04-01'),28],[Date.parse('2016-05-01'),34],[Date.parse('2016-06-01'),24],[Date.parse('2016-07-01'),40],[Date.parse('2016-08-01'),24],[Date.parse('2016-09-01'),57],[Date.parse('2016-10-01'),42],[Date.parse('2016-11-01'),51],[Date.parse('2016-12-01'),53],[Date.parse('2017-01-01'),63],[Date.parse('2017-02-01'),23],[Date.parse('2017-03-01'),80],[Date.parse('2017-04-01'),56],[Date.parse('2017-05-01'),61],[Date.parse('2017-06-01'),74],[Date.parse('2017-07-01'),107],[Date.parse('2017-08-01'),74],[Date.parse('2017-09-01'),120],[Date.parse('2017-10-01'),79],[Date.parse('2017-11-01'),163],[Date.parse('2017-12-01'),130],[Date.parse('2018-01-01'),126],[Date.parse('2018-02-01'),153],[Date.parse('2018-03-01'),236],[Date.parse('2018-04-01'),255],[Date.parse('2018-05-01'),236],[Date.parse('2018-06-01'),231],[Date.parse('2018-07-01'),223],[Date.parse('2018-08-01'),55],[Date.parse('2018-09-01'),171],[Date.parse('2018-10-01'),152],[Date.parse('2018-11-01'),139],[Date.parse('2018-12-01'),115],[Date.parse('2019-01-01'),83],[Date.parse('2019-02-01'),168],[Date.parse('2019-03-01'),79],[Date.parse('2019-04-01'),120],[Date.parse('2019-05-01'),221],[Date.parse('2019-06-01'),167],[Date.parse('2019-07-01'),192],[Date.parse('2019-08-01'),296],[Date.parse('2019-08-17'),40],]}],

这个小骗局怎么样:

$newtest = preg_replace('~.+data:\[~s', '', $html);  // remove everything before the data you want to capture

preg_match_all('~([^\]]+\])~s', $newtest, $out, PREG_SET_ORDER) ? $out : [];   // match each DETAILS segment

请记住转义(使用反斜杠)括号字符,因为它们在正则表达式中有特殊意义。

您如何知道何时到达
[详细信息]
的末尾?一些更详细的样本数据会有所帮助。谢谢尼克。我只是增加了一个例子。我希望通过匹配开始括号和结束括号(如果还没有嵌套,我建议使用regex测试工具,比如)来了解详细信息的结束时间。使用regex解析HTML(开始和结束“标记”,不确定的内容)的困难已经到了危险的地步,这无疑是一条疯狂之路!谢谢,这似乎很接近!但问题是,在一个html源中可能有多个“数据”元素,而不总是只有一个。在这种情况下,我将继续上面的逻辑。第一个“匹配”of
preg\u match\u all
将是整个匹配字符串。在另一个
preg\u replace
中使用该字符串再次删除不再需要的内容,然后运行另一个
preg\u match\u all
。您可以在
循环时将整个内容封装在
中,检查
preg\u match\u all
是否按顺序找到匹配项决定是否继续。有意义吗?这有意义。谢谢!我会立即尝试一下。如果遇到太多问题,我可能还有一个问题!我修改了你的正则表达式以更好地适应我的用例,我现在非常接近。只剩下两个问题。第一个匹配前面有一个开放的括号[还有一些空格-我不需要匹配。最后一个匹配从一个开括号和一个大括号开始[{我也不需要匹配-我怎么能基于这个排除最后一个匹配?这是我的代码
$newtest=preg\u replace('~.+数据:~s',''.$html);
preg\u match\u all('(\[+[^]+\]),$newtest,$out,preg\u SET\u顺序)?$out:[]
请发布一个包含多个“数据”元素的新示例,这样我就可以进行实验。您可以尝试添加Ungreedy修饰符:
preg\u replace(“~.+数据:~Us',”$html);