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)
而不是爆炸。替换换行符似乎不明智,因为你也会改变内容。但是,整个手动解析的设置都是有缺陷的。