Регулярные выражения PHP (REGEX) MIME (НЕ-EMAIL)

Я пытаюсь сделать "preg match all" в ответе ниже, чтобы получить все двоичные данные. Я перепробовал все, что только можно вообразить, и ради жизни не могу ничего получить.

Я надеялся, что это будет так же просто, как сделать что-то вроде этого:

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

Но я ничего не могу получить. Я тоже пробовал другие вещи. \r \n | Изм 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 на приведенной выше информации, он работает просто отлично, но когда я пробую его на реальных данных, в которых есть все дерьмо двоичных данных. не работает

5 ответов

Решение

В качестве альтернативы, вы можете разобрать с помощью 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);

\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 "ÿÙ" )ÿÙ
        )

)

Похоже, $match [1] содержит список двоичных данных, которые вы ищете.

Хорошо, я не так уж хорошо знаком с регулярными выражениями PHP...

Учитывая то, что вы пытаетесь сделать, переключатель dot-match-newline s должен работать. Использование этого регулярного выражения, похоже, сработало на моем конце:

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

* должен быть нежадным, и поэтому он будет сожрать лишь настолько, чтобы соответствовать самой первой простой текстовой строке, которую он видит.

Окончания строк могут отличаться от моих (я на машине с Windows), поэтому вам, возможно, придется запустить шестнадцатеричный редактор, чтобы увидеть, что именно должно быть найдено до и после <binary data> содержание.

У меня нет ответа относительно ваших регулярных выражений, но вы смотрели Zend_Mime?

Другие вопросы по тегам