Регулярные выражения 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?