Регулярные выражения PHP (REGEX), состоящие из нескольких частей MIME (НЕ ЭЛЕКТРОННОЙ почты)

StackOverflow https://stackoverflow.com/questions/1384513

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

Но я ничего не могу понять.Я пробовал и другие вещи тоже.\ r \ n | я просто не могу этого понять по какой-то причине.

Вот псевдоответ, не включающий заголовки:

--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 для приведенной выше информации, это работает просто отлично, но когда я пробую это на фактических данных, в которых есть всякая фигня с двоичными данными, это не работает.

Это было полезно?

Решение

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

)

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

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

Ладно, я не очень хорошо знаком с регулярными выражениями PHP...

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top