【问题标题】:Regex returning empty strings正则表达式返回空字符串
【发布时间】:2014-12-11 18:25:58
【问题描述】:

我有以下代码:

preg_match_all('/"([^"]*)"/', $json , $results);
var_dump($json);var_dump($results);die();

此时$json 的转储已

string(423) "{"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX355_.jpg";[355,266],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX425_.jpg":[425,319],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX466_.jpg":[466,350],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX450_.jpg":[450,338],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL.jpg":[500,375]}"

我正在尝试获取链接。我试过json_decode,但我得到错误号 4,这是不正确的语法。字符串的 JSON 前后没有不可见的字符。没有运气,我决定尝试正则表达式,但上面的代码返回

array(2) { [0]=> array(0) { } [1]=> array(0) { } }

任何帮助获得第一个第一将不胜感激。

好的,正如你们中的一些人所指出的,这基本上是一种让它无论如何都能正常工作的技巧。如果你有兴趣这样做,这里是完整的信息:

$ch = curl_init("http://www.amazon.com/gp/product/B00BEL2G4C/ref=s9_wish_gw_d31_g21_i3?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=desktop-1&pf_rd_r=1VPYMKFSFN5BRHD4AD3W&pf_rd_t=36701&pf_rd_p=1970559082&pf_rd_i=desktop");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true );
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt" );
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt" );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0");
$curl_scraped_page = curl_exec($ch);

$html = $html->load($curl_scraped_page);
$json = $html->find('#imageBlock', 0)->children[0]->children[0]->children[1]->children[1]->children[0]->children[2]->children[0]->children[0]->children[0]->children[0]->children[0]->attr['data-a-dynamic-image'];

$json = utf8_encode($json);
var_dump(json_decode($json));var_dump(json_last_error());die();

我知道亚马逊有一个 API,但它们很烦人,只有当你是附属公司时才会让你使用它,而且他们不接受正在建设的网站作为附属公司,所以我只是想把它弄出来,然后会改变一旦网站上线并获得亚马逊附属公司的批准,它就会发送到 API。

网址实际上是动态的,只是为了测试目的使用了静态网址。 我会喜欢找到一个 JSON 解决方案,因为这样会更干净。

【问题讨论】:

  • 为什么不把 JSON 解析成数组呢?这将使您的数据更容易获取,而不是对字符串进行正则表达式。
  • 我试过了,得到了不正确的语法错误,即使我检查了 json lint 并且它是一个有效的 json :( 如果你有一个,我会采取一个解决方案 :)
  • 因此,您决定以丑陋的方式破解它,而不是通过找出 jsode_decode() 不起作用的原因以正确的方式进行操作?
  • json_decode() 对我来说效果很好(PHP 5.5.19)
  • 看看这个:3v4l.org/O9bIo。它似乎在自 5.2.0 以来的所有 PHP 版本上都可以正常工作(当引入 json_decode() 时)。

标签: php regex json


【解决方案1】:

这样做 -

$parsed = json_decode($json, true);
foreach($parsed as $row=>$value){
    echo $row .'<br>';
}

EXAMPLE

【讨论】:

  • 得到“NULL” :(我以前试过这个,甚至使用utf8_encode
  • 你看例子了吗? JSON 字符串的代码与@bia.migueis 有何不同?
  • 我不确定它有什么不同。看起来一样,但是我可能在我找不到的地方有一些看不见的字符。我用有关如何获取 json 的信息更新了问题。
  • 你能重现 PHP Fiddle 的问题吗?
  • 嗯第一次使用小提琴所以请原谅我的任何错误:phpfiddle.org/main/code/bqys-5272
【解决方案2】:

不知道为什么它不起作用。这对我有用:

<?php

$json ='{"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX355_.jpg":           [355,266],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX425_.jpg":[425,319],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX466_.jpg":[466,350],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX450_.jpg":[450,338],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL.jpg":[500,375]}';

 preg_match_all('/"([^"]*)"/', $json , $results);
 var_dump($json);var_dump($results);die();
?>

输出是:

    gregp:~ greg$ php ./test.preg.php 
string(373) "{"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX355_.jpg":[355,266],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX425_.jpg":[425,319],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX466_.jpg":[466,350],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX450_.jpg":[450,338],"http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL.jpg":[500,375]}"
array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(65) ""http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX355_.jpg""
    [1]=>
    string(65) ""http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX425_.jpg""
    [2]=>
    string(65) ""http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX466_.jpg""
    [3]=>
    string(65) ""http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX450_.jpg""
    [4]=>
    string(57) ""http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL.jpg""
  }
  [1]=>
  array(5) {
    [0]=>
    string(63) "http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX355_.jpg"
    [1]=>
    string(63) "http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX425_.jpg"
    [2]=>
    string(63) "http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX466_.jpg"
    [3]=>
    string(63) "http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL._SX450_.jpg"
    [4]=>
    string(55) "http://ecx.images-amazon.com/images/I/51Lg%2Bd4cqRL.jpg"
  }
}

【讨论】:

  • 是的,如果我将 json 粘贴到变量中并使用它可以工作,但是当 json 动态出现时它不起作用
  • 我认为可能存在格式或字符集问题
【解决方案3】:

只需在 "'s 之间进行非贪婪匹配

preg_match_all('/"(.*?)"/', $json , $results);
var_dump($json);var_dump($results);die();

【讨论】:

  • array(2) { [0]=> array(0) { } [1]=> array(0) { } }
  • preg_match_all 隐含 g 修饰符,否则你将只使用 preg_match
【解决方案4】:

所以我必须在调用解码之前执行$json = preg_replace('/&amp;quot;/', '"', $json);,这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2022-07-24
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多