【问题标题】:How to parse raw POST data into array?如何将原始 POST 数据解析为数组?
【发布时间】:2011-03-18 10:58:27
【问题描述】:

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

------------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'] 

等等里面有数据吗?

【问题讨论】:

  • @fabrik 不,您链接的问题非常不同。这也是我的问题。请仔细阅读。
  • 我也看到了你的问题。我看不到的一件事:差异。这两个问题都要求读取这些值。
  • @fabrik 在这个问题中,我作为如何手动解析原始帖子数据。在您链接的问题中,我问如何做到这一点,以便 PHP 自己正确解析 POST 请求。你现在看到区别了吗?
  • 并非如此。祝你好运,托马斯。

标签: php regex parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      $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 会删除多个换行符,因此您必须更有创意。

      【讨论】:

      • 最好用新行分解字符串然后将第一行作为边界,大多数时候你不会知道边界! - 对 cf/nl 的建议尝试标准化新行 str_replace(array("\r","\n"),"\r\n",$string);
      • 无论如何这都是有缺陷的,应该preg_split("/-+$boundary/",$data) 而不是爆炸。替换换行符似乎并不明智,因为您也会更改内容。但话又说回来,手动解析的整个设置是有缺陷的。
      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多