【问题标题】:Regular expression to extract json response in php在php中提取json响应的正则表达式
【发布时间】:2012-05-25 03:35:22
【问题描述】:

我是 php 新手,正在尝试使用 preg_match 编写一个正则表达式来提取我从 http get 中获得的 href 值。 响应看起来:

{"_links":{"http://a.b.co/documents":{"href":"/docs"}}}

我只想提取 href 值并将其传递给我的下一个 api...即 /docs。 谁能告诉我如何提取这个? 我一直在使用http://www.solmetra.com/scripts/regex/index.php 来测试我的正则表达式.. 从上一天开始就没有运气:(

如有任何帮助,我们将不胜感激。

谢谢, 博士

【问题讨论】:

  • 没有。不要使用正则表达式解析 JSON。使用 JSON 解析器。
  • 使用正则表达式解决问题只会给您带来两个问题...

标签: php regex


【解决方案1】:

不需要正则表达式。

使用json_decode(),然后访问href 属性。

例如:

$data = json_decode('{"_links":{"http://a.b.co/documents":{"href":"/docs"}}}', true);
echo $data['_links']['http://a.b.co/documents']['href'];

注意:如果可能,我建议您清理 JSON。尤其是按键。

【讨论】:

  • +1 只是做了同样的回答 - 这是一个例子:codepad.org/t8F5oL1K
  • 非常感谢杰森。这对我有用。我也会清理我的 json。
  • 太棒了。欢迎使用 Stack Overflow。
  • @deeptirao - 如果这个答案解决了你的问题,请记得接受它。
【解决方案2】:

不要使用正则表达式,使用json_decode()。 JSON 是一个很好的上下文无关语法示例,您甚至不应该尝试使用正则表达式进行解析。

这是 PHP.NET 的 reference on using json_decode() 用于这类事情。

【讨论】:

  • 你能告诉我如何将这个 $data 传递给我的下一个函数吗?我确实说 return $data;在我的第一个函数中,然后在我的下一个函数中调用这个 $data...当我运行代码时,我得到 Undefined variable: data...
  • @deeptirao - 你尝试过 Jason 第二行代码中的数组索引样式吗?他更深入地研究了json_decode的用法,他的代码看起来是正确的。
【解决方案3】:

就像 HTML 解析一样,我建议不要使用正则表达式,而是使用 json 解析器然后读取值。查看 php.ini 中的 json_encode 和 json_decode 函数。

也就是说,如果您只需要 href 值,那么这里有一个正则表达式可以在您给出的示例中执行此操作

preg_match('/"href":"([^"]+)"/',$string,$matches);
$matches[1];// this is the href

只有当您确切地知道自己想要什么以及它将采用的格式时,Regex 才是正确的工具。通常无法准确预测来自其他方的 json 和 HTML。还有一些合法的 HTML 和 json 的例子不能用正则表达式正确解析,所以通常为它们使用专门的解析器。

【讨论】:

  • “这是个坏主意,这是怎么做的。” ????投反对票,希望能防止新手复制/粘贴不必要的正则表达式。
  • 我很清楚正确的方法是使用我所说的解析函数,但我也知道在实际项目中有时您不需要开销或学习新工具。
  • 究竟是什么的开销?在实际项目中,您不应该学习使用新工具吗?什么?!?
  • 在 json 解码中,您必须解析整个字符串并将其保存在内存中,对于小字符串没什么大不了的,对于大字符串,您可以花点时间。对于正则表达式,它只需要拉出他想要的一部分。 HTML解析通常是相同的方式。安全且正确的方法是使用该库,但是当您只需要单个数据链接时,您将拥有整个 DOM 价值的信息在内存中。当您确切地知道自己想要什么并且确切地知道它将采用的格式时,那么正则表达式就是适合这项工作的工具。
  • 一个建议:我会使用(["'])(.*?)\1 之类的东西来解释单引号和双引号。两者都很常见。
猜你喜欢
  • 2012-09-29
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2019-08-01
相关资源
最近更新 更多