Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.

Как разобрать такой POST ответ? API интернет-магазина

Интернет магазин имет свое API. На запрос он выдает в браузере следующиее:

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Fri, 22 Feb 2013 10:34:03 GMT
Server: Apache/2.2.8 (CentOS)
X-Powered-By: PHP/5.3.20
X-Powered-By: PleskLin
Content-Length: 2497
Content-Type: text/html

<pre>
Array
(
    [id] => 41
    [name] => TRAXXAS
    [site] => www.traxxas.com
    [description] => 
    [imagename] => imglib/icon_brand/201112141035__79235c09.jpg
    [subdomain] => traxxas
)
</pre>



Вопрос. Как их этого сделать массив без всяких регулярок?
— PS. похоже это баг на сайте — отладочкая информация. Всем спасибо.
  • Вопрос задан
  • 4772 просмотра
Решения вопроса 1
Alexufo
@Alexufo Автор вопроса
противоречивый, сложный, весь компьютерный.
Тех поддержка ответила. Сказала что там есть поле для ответа скрипта. Туда нужно вставить адрес нашего скрипта, на который придет post ответ. По умолчанию, там как раз была ссылка в которой и было прописано print_r();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 10
gaelpa
@gaelpa
Написать разработчикам этого магазина вопрос «Что вы ЭТИМ имели в виду??» вероятно найдется и скрипт, выдающий ответ в нормальном виде, уж больно сильно этот смахивает на отладочный интерфейс.
Ответ написан
Комментировать
fear86
@fear86
Developer
Скорее всего разбирать руками.
Ответ написан
Комментировать
AterCattus
@AterCattus
Люблю быстрый backend
$a = explode("\n", $a);
$a = array_map('trim', $a);
// выборка строк, начинающихся на "[" и содержащих "] => "
$a = array_filter(
    $a,
    function($i) {
        return (0 === strpos($i, '[')) && (false !== strpos($i, '] => '));
    }
);

$result = array();
// разделение строк по  "] => " и наполнение итогового словаря
$a = array_map(
    function($i) use(&$result) {
        $i = explode('] => ', ltrim($i, '['), 2);
        $result[$i[0]] = $i[1];
    },
    $a
);

print_r($result);


Можно объединить и в одну итерацию, если хочется.
Ответ написан
Urvin
@Urvin
Без регулярок — руками.
С регулярками — можно print_r_reverse, если ответ непредсказуем
Ответ написан
Комментировать
CodeByZen
@CodeByZen
php, js, my/mssql, sqlite, html, css, it-consult
C регулярками проще в разы. Делается все в 4 строки. Стоит обратить внимание.
Если ответ именно такой как у Вас. То подайдет следующий код:
в переменной $post то, что вернул сервер
$arr=explode("<pre>",$post);
preg_match_all("/\n\s+?\[([^\]]+)\]\s=>\s([^\n]+)/is", $arr[1],$m);
foreach($m[1] as $k=>$v) { $out[$v]=$m[2][$k]; }
print_r($out);


В результате получим вот такой массив:
Array
(
    [id] => 41
    [name] => TRAXXAS
    [site] => www.traxxas.com
    [imagename] => imglib/icon_brand/201112141035__79235c09.jpg
    [subdomain] => traxxas
)
Ответ написан
@egorinsk
Выглядит, как будто кто-то отлаживает код и временно поставил var_dump(). Вы уверены, что это не временная проблема?

Если не временная. то разбирать, видимо, при помощи регулярок и (возможно) html_entities_decode.
Ответ написан
Комментировать
blo
@blo
инженер-программист
Попробуйте в запросе указать другой Content-Type и Accept, например
application/json
Ответ написан
@edogs
На запрос именно в браузере он это выдает? Прокси и прочего нет?
Не так давно сталкивались с аналогичным и там тоже было HTTP/1.1 100 Continue.
Но когда стали тащить не первую часть (не вспомним уже сейчас почему отдавалась только 1-ая часть, но изменения с нашей стороны привели к нормальному результату в итоге), а полный ответ, то в остатке сразу после var_dump был нормальный полноценный xml ответ.
В общем проверьте реально ли полностью Вы получаете ответ, нет ли чего после этого print_r-а.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Просто напишите в ТП сайта, что неплохо бы иметь две версии: Production и Development для API-разработки.
Ответ написан
Комментировать
pletinsky
@pletinsky
Я не php девелопер. Насколько я понимаю это кусок php кода, представляющий из себя обьект, вместо его представления в json.

То есть Вам нужно завршить работу этих чуваков, которые не дописали нужный код по сериализации обьекта в json.

1) Вытащите содержимое тега pre в строку.
2) Поместите его внутрь следующей сроки: «json_encode({Ваш массив})» и добавьте еще вывод результата энкодинга в файл.
3) Выполните данный код php интерпретатором.
4) Прочитайте получившейся json.

Думаю можно сильно упростить работы используя execute или еще лучше eval и подав им на вход строковое представление данного массива. Тогда получите сразу обьект.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы