Я думаю, что нашел, где ошибка:
$convertJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=" . $currencyValue . $currencySelectValue . "%3D%3FUSD", true); var_dump($convertJSON); $convertArr = json_decode($convertJSON, true); var_dump($convertArr);
Я делаю это для отладки, и получаю этот результат (я ввел 555 и евро):
string(68) "{lhs: "555 Euros",rhs: "796.64700 US dollars",error: "",icc: true}" NULL
Таким образом, кажется, что функция PHP для декодирования объекта JSON что-то делает что-то неправильно. Любая помощь?
Ответ Google дает вам недействительный JSON, потому что метки не цитируются. Вам придется самому разобрать.
$response = '{lhs: "555 Euros",rhs: "796.64700 US dollars",error: "",icc: true'; preg_match('/rhs:\s*"([^"]+)"/', $response, $m); echo $m[1];
Вывод:
796.64700 US dollars
Не прямой ответ на этот вопрос, но проблема, которую я потратил несколько часов, пытаясь решить.
Если вы пытаетесь декодировать JSON, который поступает из удаленного файла через CURL, и если этот файл находится в формате UTF-8 , начало файла может иметь следующие символы (который разбивает json_decode ():

Которое вы не увидите невооруженным глазом, только через htmlentities();
Я понятия не имею, почему они там, я проследил это до curl_exec()
, думая, что, возможно, они добавляются туда. В любом случае эти маленькие ублюдки добавлялись только тогда, когда файл находится в формате UTF-8.
Итак, если вы не контролируете кодировку исходного файла, вы можете сделать что-то вроде этого, прежде чем передать строку в json_decode ():
$encoding = mb_detect_encoding($json); if($encoding == 'UTF-8') { $json = preg_replace('/[^(\x20-\x7F)]*/','', $json); } print_r(json_decode($json));
Надеюсь, я кое-что сэкономил, мне потребовалось несколько часов, чтобы выяснить, что происходит.
разделите его на все, кроме десятичных точек, запятых и чисел, и дайте мне результат.
На самом деле вы делаете то же самое с вашим регулярным выражением. Добавьте a после [
: [^
чтобы отменить это
$currencyValue = preg_replace('/([^0-9\.,]+)/', '', $currencyValue);
чтобы сделать json_encode работоспособным, вам нужно добавить двойную кавычку к строке результата, чтобы сделать ее в формате JSON.
Я пробую простой код ниже, и он отлично работает:
$data = '{lhs: "1 US dollar",rhs: "7.80177256 Hong Kong dollars",error: "",icc: true}'; $data = str_replace('lhs','"lhs"',$data); $data = str_replace('rhs','"rhs"',$data); $data = str_replace('error','"error"',$data); $data = str_replace('icc','"icc"',$data); print_r(json_decode($data));
stdClass Object ( [lhs] => 1 US dollar [rhs] => 7.80177256 Hong Kong dollars [error] => [icc] => 1 )
Теперь он находится в объекте json_decode!
Расширение на Матфея отвечает:
Если по какой-то причине вы хотите получить все данные; (возможно, не на всякий случай?)
$c='{lhs: "1 British pound",rhs: "1.5358 US dollars",error: "",icc: true}'; $j=json_decode(preg_replace('/({|,)([az]+): /','$1"$2": ',$c)); var_dump($j->{'rhs'});
Я наткнулся на эту страницу, прежде чем я ее обработал, поэтому, возможно, другие тоже будут 🙂