0

我正在尝试对下面的响应进行“preg match all”以获取所有二进制数据。我已经尝试了几乎所有可以想象的东西,而对于我的生活,什么也得不到。

我希望它就像做这样的事情一样简单:

preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches);

但我什么也得不到。我也尝试过其他的东西。\r \n | ism U - 由于某种原因我无法得到它。

这是一个不包括标题的伪响应:

--boundary
content-type:image/jpeg

<binary data>
--boundary
content-type:image/jpeg

<binary data>
--boundary
content-type:image/jpeg

<binary data>
--boundary

不幸的是,二进制数据没有用 < & > 括起来,它只是在多行过程中带有特殊字符的原始数据......

另外:我认为问题在于正在显示的实际二进制数据,因为当我在上面的信息上运行 preg match all 时,它工作得很好,但是当我在包含所有二进制数据废话的实际数据上尝试它时,它不起作用。

4

5 回答 5

2

\n是平台相关的。大概您的数据是http请求还是电子邮件?在这种情况下,换行符将为\r\n,因此您需要对其进行测试

于 2009-09-06T11:48:19.227 回答
1

根据您提供的数据,您的表达似乎对我来说很好。我拉下了你的 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 "ÿÙ" )ÿÙ
        )

)

看起来 $matches[1] 包含您所追求的二进制数据列表。

于 2009-09-06T00:35:42.763 回答
1

或者,您可以使用explode() 进行解析,这应该会快得多,它不会太复杂,并且如果您需要,它会为您提供标题信息:

<?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);
于 2009-09-06T21:40:39.240 回答
0

我没有关于您的正则表达式的答案,但是您看过Zend_Mime吗?

于 2009-09-05T23:48:19.247 回答
0

好的,我对 PHP 正则表达式不是很熟悉......

考虑到您要执行的操作, dot-matches-newline 的开关应该可以工作。使用这个正则表达式似乎对我有用:

/<binary data>\r\n(.*?)\r\n--simple boundary/s

这 *?应该是非贪婪的,因此它只会吞噬它所看到的第一个 --simple 边界文本字符串。

您的行尾可能与我的不同(我在 Windows 机器上),因此您可能必须启动十六进制编辑器才能准确查看内容前后应匹配的<binary data>内容。

于 2009-09-06T00:49:59.787 回答