PHP:解析包含多部分表单数据的后响应

时间:2014-10-17 06:44:20

标签: php arrays curl multipartform-data

我一直在使用API​​,我曾经运行过一个cron作业,并且每隔5分钟就进行一次API调用。最近,他们推出了类似于PayPal IPN的功能,一旦订单得到响应,它就会发布变量。

我确实打印了帖子变量并邮寄它以查看响应的内容。这是我使用的代码。

$post_var = "Results: " . print_r($_POST, true);
mail('email@mail.com', "Post Variables", $post_var);

我收到了邮件。

Results: Array
(
    [--------------------------918fc8da7040954f
Content-Disposition:_form-data;_name] => "ID"

1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="TXN"

1234567890
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Comment"

This is a test comment
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectID"

1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectName"

Test Connect (nonexisting)
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Status"

Unavailable
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="CallbackURL"

http://www.example.com/ipn
--------------------------918fc8da7040954f--

)

现在我需要ID的值,即1,TXN,即1234567890等,我从未使用过这些数组。我该如何进行以及我实际得到的回应是什么。这是cUrl响应还是多部分表单数据响应?

请尽可能向我解释。

1 个答案:

答案 0 :(得分:1)

即使这个问题已经有6个月了,我也会在这里添加我的回复,因为我刚遇到这个问题并且无法在线找到简单的解析器。

假设$response包含您的多部分内容:

// Match the boundary name by taking the first line with content
preg_match('/^(?<boundary>.+)$/m', $response, $matches);

// Explode the response using the previously match boundary
$parts = explode($matches['boundary'], $response);

// Create empty array to store our parsed values
$form_data = array();

foreach ($parts as $part)
{
    // Now we need to parse the multi-part content. First match the 'name=' parameter,
    // then skip the double new-lines, match the body and ignore the terminating new-line.
    // Using 's' flag enables .'s to match new lines.
    $matched = preg_match('/name="?(?<key>\w+).*?\n\n(?<value>.*?)\n$/s', $part, $matches);

    // Did we get a match? Place it in our form values array
    if ($matched)
    {
        $form_data[$matches['key']] = $matches['value'];
    }
}

// Check the response...
print_r($form_data);

我确信这种方法有很多警告,所以你的里程可能会有所不同,但它满足了我的需求(解析BitBucket片段API响应)。欢迎任何意见/建议。