Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将原始POST数据解析为数组?_Php_Regex_Parsing - Fatal编程技术网

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

Php 如何将原始POST数据解析为数组?,php,regex,parsing,Php,Regex,Parsing,我的原始表单数据如下所示: ------------V2ymHFg03ehbqgZCaKO6jy Content-Disposition: form-data; name="intro" O ------------V2ymHFg03ehbqgZCaKO6jy Content-Disposition: form-data; name="title" T ------------V2ymHFg03ehbqgZCaKO6jy Content-Disposition: form-data; nam

我的原始表单数据如下所示:

------------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_字段的第二行是该文件的数据(此处不可见)。因此我的问题是:

如何解析上述数据以生成表:

$result['intro'] 
以此类推,其中包含数据?

$boundary=“------V2ymHFg03ehbqgZCaKO6jy”//从内容类型中获取此值
$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...
    }
}
$rawfields=explode($boundary,$data); array_pop($rawfields);//删除最后一个--part foreach($id=>$block的rawfields) { list($mime,$content)=explode(“\r\n\r\n”,$block,2);//我认为这是标准的,也许可以检查一下! if(preg_match('/name=“([^”]*)”/i',$mime,$match)) { $result[$match[1]]=$content; //todo:在其他领域做一些时髦的事情 }否则{ $result[]=$content;//以防万一。。。 } }
普雷斯托


编辑:您还应该从每个内容块中删除换行符,但是
rtrim
将删除多个换行符,因此您必须更具创造性。

整个文档的内容类型是
多部分
,各部分由给定边界分隔

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


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

我自己也在处理一个类似的问题,并编写了自己版本的mvds代码来处理二进制文件。供将来参考。

在您链接的问题中,可能会重复@fabrik No。这也是我的问题。请仔细阅读。我看到这也是您的问题。有一点我没有看到:dif引用。这两个问题都要求读取这些值。@fabrik在这个问题中提到如何手动解析原始post数据。在你链接的问题中,我问如何才能让PHP自己正确解析post请求。你现在看到区别了吗?不太清楚。祝你好运,Tomasz。最好用新行分解字符串,然后得到第一行b边界,大多数时候你都不知道边界!-cf/nl的ragards尝试标准化新行
str\u replace(数组(“\r“,“\n”),“\r\n”,$string);
无论如何这是有缺陷的,应该
preg\u split(/-+$boundary/,$data)
而不是爆炸。替换换行符似乎不明智,因为你也会改变内容。但是,整个手动解析的设置都是有缺陷的。