Регулярные выражения PHP (REGEX), состоящие из нескольких частей MIME (НЕ ЭЛЕКТРОННОЙ почты)
Вопрос
Я пытаюсь выполнить "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>
Содержание.