Regex возвращает пустые строки

0

У меня есть следующий код:

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]}"

Я пытаюсь получить ссылки. Ive попробовал json_decode но я получаю ошибку номер 4, которая является неправильным синтаксисом. Нет невидимых символов спереди или после JSON на строке. Без везения я решил попробовать в нем регулярное выражение, но приведенный выше код вернется

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

Любая помощь, чтобы получить первый первый, будет очень благодарна.

Хорошо, как некоторые из вас отметили, что это в основном хак, чтобы заставить его работать независимо от того, что. Если вы заинтересованы в том, чтобы сделать это правильно, заполните полную информацию:

$ch = curl_init("http://rads.stackoverflow.com/amzn/click/B00BEL2G4C");
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();

Я знаю, что у Amazon есть API, но они раздражают и позволят вам использовать его только в том случае, если вы являетесь аффилированным лицом, и они не принимают под строительство веб-сайтов в качестве аффилированных лиц, поэтому я просто пытаюсь получить это и изменит его на API после того, жить и получать одобрение для амазонских веток.

URL-адрес фактически динамический, он просто используется для тестирования в статическом. Я хотел бы найти решение JSON, поскольку это было бы намного чище.

  • 0
    Почему бы не проанализировать JSON в массив? Это облегчит доступ к вашим данным, а не к регулярному выражению строки.
  • 0
    Я попробовал это и получил неправильную синтаксическую ошибку, хотя я проверял с помощью json lint, и это действительный json :( Я бы принял решение вместо этого, если у вас есть :)
Показать ещё 5 комментариев
Теги:

4 ответа

2

Сделай это -

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

ПРИМЕР

  • 0
    получил "NULL" :( я пробовал это раньше, даже используя utf8_encode
  • 0
    Вы смотрели на пример? Чем отличается код для строки JSON от @ bia.migueis?
Показать ещё 9 комментариев
1

Не уверен, почему он не работает. Это работает для меня:

<?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"
  }
}
  • 0
    да, если я вставляю json в переменную и использую, что он работает, но он не работает, когда json приходит динамически
  • 0
    Я думаю, что есть проблема форматирования или кодировки
1

Просто сделайте неживое соответствие между

preg_match_all('/"(.*?)"/', $json , $results);
var_dump($json);var_dump($results);die();
  • 0
    массив (2) {[0] => массив (0) {} [1] => массив (0) {}}
  • 0
    Попробуйте флаги sg
Показать ещё 1 комментарий
0

Поэтому мне пришлось выполнить $json = preg_replace('/&quot;/', '"', $json); перед вызовом декодирования и исправлением моей проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню