【问题标题】:PHP Regular Expressions (REGEX) Multipart MIME (NOT-EMAIL)PHP 正则表达式 (REGEX) 多部分 MIME (NOT-EMAIL)
【发布时间】:2010-11-25 22:50:24
【问题描述】:

我正在尝试对下面的响应进行“预匹配全部”以获取所有二进制数据。我已经尝试了几乎所有可以想象到的东西,但在我的一生中,什么都得不到。

我希望它会像这样简单:

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

但我什么也得不到。我也尝试过其他的东西。 \r \n | i s m 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 时,它工作得很好,但是当我在包含所有二进制数据的实际数据上尝试它时废话,它不起作用。

【问题讨论】:

  • 您也可以在这里发布您的示例而不是网址。当此链接的内容已被长期更改时,其他人可能会在将来偶然发现您的问题。
  • 我在您提供的数据上尝试了正则表达式并且它有效。尝试回显变量 $boundary 以检查您的期望。
  • 我的脚本中没有这样的错误。

标签: php regex mime boundary


【解决方案1】:

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

【讨论】:

  • 我不知道。谢谢你的提示。所以 \r\n 几乎是通用的?
  • 不,但它是大多数基于 Web 的协议(http 和邮件)的标准。
【解决方案2】:

或者,您可以使用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);

【讨论】:

    【解决方案3】:

    根据您提供的数据,您的表达对我来说似乎很合适。我拉下了你的 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] 包含您所追求的二进制数据列表。

    【讨论】:

    • 我仍然得到两个空数组:(
    • 哦该死...我想我找到了导致问题的原因..当我使用 wamp 在我的 windows xp pc 上本地运行此脚本时,我什么也没得到,但是当我在我的 linux 服务器上运行它时工作得很好。有什么想法吗?
    • 哦,你应该只对 [body]=>array 中的东西运行预匹配 // 但除此之外我猜它工作得很好,但在 Windows 上不行...嗯
    • ahh windows... 尝试将 FILE_BINARY 作为第二个参数传递给 file_get_contents()
    • 你也可以在你的 ns 之前尝试一个双反斜杠(比如 \\n),这样它就会被 preg 而不是 php 字符串常量扩展。
    【解决方案4】:

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

    【讨论】:

    • 是的,我过去有过,zend 的东西对我来说是陌生的,但谢谢你的提示。
    • 如果你不喜欢学习如何使用 Zend 框架,你也可以看看 Zend_Mime_Decode 类。我想 splitMime 功能可能对您很有帮助。这是链接:framework.zend.com/code/browse/~raw,r=9280/Zend_Framework/trunk/…
    • 该类正在使用与我已经制作的方法类似的方法。我只是想看看我是否可以用一个 preg_match_all 语句解析
    【解决方案5】:

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

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

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

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

    您的行尾可能与我的不同(我在 Windows 机器上),因此您可能需要启动十六进制编辑器才能准确查看 &lt;binary data&gt; 内容之前和之后应该匹配的内容。

    【讨论】:

    • 感谢您的提示,我会尝试的。在看到 JasonWoof 能够让它工作后,我将问题缩小到运行脚本的操作系统,而不是在 linux 机器上运行良好的正则表达式本身。
    • 很高兴听到您缩小范围
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多