我试图做一个“预浸匹配所有”下面让所有二进制数据的响应。我尝试过所有可以想象的和我的生活,不能得到任何东西。

我希望它会是简单的做这样的事情:

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>内容后进行匹配。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top