如何将原始POST数据解析成数组?

时间:2010-07-20 13:36:54

标签: php regex parsing

我有一个原始表单数据,如下所示:

------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="intro"

O
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="title"

T
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="apiKey"

98d32fdsa
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="method"

/media/add
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="upload_field"; filename="original_filename.png"
Content-Type: image/png


------------V2ymHFg03ehbqgZCaKO6jy--

(代替upload_field的第二行,有这个文件的数据(此处不可见)。所以我的问题是:

如何解析上面的数据以获得表格:

$result['intro'] 

等内有数据?

3 个答案:

答案 0 :(得分:1)

$boundary = "------------V2ymHFg03ehbqgZCaKO6jy"; // take this from content-type
$rawfields = explode($boundary,$data);
array_pop($rawfields); // drop the last -- piece
foreach ( $rawfields as $id=>$block )
{
    list($mime,$content) = explode("\r\n\r\n",$block,2); // I think it's <cr><lf> by standards, maybe check!
    if ( preg_match('/name="([^"]*)"/i',$mime,$match) )
    {
        $result[$match[1]] = $content;
        // todo: do funky stuff with other fields
    } else {
        $result[] = $content; // just in case...
    }
}

似的。

编辑:您还应该修剪每个内容块中的换行符,但rtrim会删除多个换行符,因此您必须更有创意。

答案 1 :(得分:1)

整个文档的内容类型为multipart,其中的部分由给定的边界分隔。

多部分文档中的每个部分或消息都采用标准消息格式:标题行,后跟空行,后跟表示该部分内容的字节序列。 HTTP和SMTP都是这样工作的。

对于Content-Disposition: form-data; name="title"这样的标题行,您必须小心name,因为它可以被编码(考虑如何表示任意值,例如包含双引号或者换行)。

答案 2 :(得分:0)

我自己正在处理类似的问题,并编写了自己的mvds代码版本,以便使用二进制文件。 Here's the thread以供将来参考。