PHP正则表达式(正则表达式)多部分MIME(NOT-EMAIL)
题
我试图做一个“预浸匹配所有”下面让所有二进制数据的响应。我尝试过所有可以想象的和我的生活,不能得到任何东西。
我希望它会是简单的做这样的事情:
preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches);
但我不能得到任何东西。我尝试过其他的东西了。 \ r \ n |我S Mü - 我只是无法得到它由于某种原因,
下面是一个伪响应不包括标头:
--boundary
content-type:image/jpeg
<binary data>
--boundary
content-type:image/jpeg
<binary data>
--boundary
content-type:image/jpeg
<binary data>
--boundary
不幸的是,二进制数据不包围<&>它只是有特殊字符的原始数据上的多行...
的过程中也:我觉得问题在于实际的二进制数据中正在显示,因为当我运行预浸匹配的信息上述所有它工作得很好,但是当我尝试它的实际数据有所有的二进制数据垃圾在里面,这是行不通的。
解决方案
另外,你可以用爆炸()这应该是快很多,这不是太复杂,解析,如果你想它,它给你的头信息:
<?php
$body = file_get_contents('output.txt');
$boundary = '__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__';
$parts = explode("--$boundary", $body);
array_shift($parts); # delete up to the first boundary
array_pop($parts); # delete after the last boundary
$binaries = array();
foreach($parts as $part) {
list($header, $binary) = explode("\n\n", $part, 2);
$binaries[] = $binary;
}
print_r($binaries);
其他提示
\n
是依赖于平台的。想必你的数据是一个http请求或电子邮件?在这种情况下,换行会\r\n
,所以你需要测试,与其
你的表达似乎很好地工作,我对你所提供的数据。我拉下你的output.php,并将其更名为output.txt中,然后运行此脚本:
<?php
$body = file_get_contents('output.txt');
$boundary = '__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__';
preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches);
print_r($matches);
似乎有工作得很好,即,它的印刷这样的:
Array
(
[0] => Array
(
[0] =>
[body] =>
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__
[1] =>
ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__
[2] =>
ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__
[3] =>
ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__
[4] =>
ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__
)
[1] => Array
(
[0] => [body] =>
[1] => ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
[2] => ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
[3] => ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
[4] => ÿ( RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ" )ÿÙ
)
)
看起来像$匹配[1]包含你后的二进制数据的列表。
我没有对自己的正则表达式的答案,但是你看看的 Zend_Mime ?
好吧,好吧,我不是所有熟悉PHP正则表达式...
考虑你正在尝试做的,点百搭换行符s开关应该工作。使用似乎工作在我结束这个正则表达式:
/<binary data>\r\n(.*?)\r\n--simple boundary/s
在*?应该是非贪心,并且因此将仅吞噬这么多,因为它看到非常第一--simple边界文本字符串匹配。
您行结尾可以从我的(我是一个Windows机器上)不同,所以你可能要启动一个十六进制编辑器,看看到底应该怎样前后<binary data>
内容后进行匹配。
不隶属于 StackOverflow