تعبيرات PHP العادية (REGEX) MIME MIME (غير الأوسط)
سؤال
أحاول القيام بـ "مطابقة Preg All" على الاستجابة أدناه للحصول على جميع البيانات الثنائية. لقد جربت فقط كل شيء يمكن تخيله ولوحياتي ، لا يمكنني الحصول على أي شيء.
كنت آمل أن يكون الأمر بسيطًا مثل فعل شيء مثل هذا:
preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches);
لكن لا يمكنني الحصول على أي شيء. لقد جربت أشياء أخرى أيضًا. r n | ism u - لا أستطيع الحصول عليها لسبب ما.
فيما يلي استجابة زائفة لا تشمل الرؤوس:
--boundary
content-type:image/jpeg
<binary data>
--boundary
content-type:image/jpeg
<binary data>
--boundary
content-type:image/jpeg
<binary data>
--boundary
لسوء الحظ ، لا يتم إرفاق البيانات الثنائية بـ <&> إنها مجرد بيانات أولية ذات أحرف خاصة على مدار خطوط متعددة ...
أيضًا: أعتقد أن المشكلة تكمن ضمن البيانات الثنائية الفعلية التي يتم عرضها لأنه عندما أقوم بتشغيل مطابقة preg على المعلومات أعلاه ، تعمل بشكل جيد ولكن عندما أحاول ذلك على البيانات الفعلية التي تحتوي على جميع بيانات البيانات الثنائية فيه ، لا يعمل.
المحلول
بدلاً من ذلك ، يمكنك تحليلها مع expresh () يجب أن يكون هذا أسرع بكثير ، فهو ليس معقدًا للغاية ، ويمنحك معلومات الرأس إذا كنت تريد ذلك:
<?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
, ، لذلك تحتاج إلى اختبار ذلك بدلاً من ذلك
يبدو أنك تعبير يعمل بشكل جيد بالنسبة لي على البيانات التي قدمتها. لقد قمت بسحب الإخراج الخاص بك.
<?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 "ÿÙ" )ÿÙ
)
)
يبدو أن مباريات $ [1] تحتوي على قائمة البيانات الثنائية التي تتبعها.
ليس لدي إجابة بخصوص تعبيراتك المعتادة ، لكن هل ألقيت نظرة على Zend_Mime?
حسنًا ، أنا لست على دراية بالتعبيرات العادية PHP ...
بالنظر إلى ما تحاول القيام به ، يجب أن يعمل مفتاح Dot-Matches-Newline S. يبدو أن استخدام هذا التعبير العادي يعمل في نهايتي:
/<binary data>\r\n(.*?)\r\n--simple boundary/s
ال *؟ يجب أن تكون غير غريدي ، ولذا فإنه سوف يلتزم بقدر ما يتطابق مع سلسلة نص الحدودية البسيطة التي تراها.
قد تختلف نهايات خطك عني (أنا على جهاز Windows) ، لذلك قد تضطر إلى إطلاق محرر سداسي لمعرفة ما يجب مطابقة بالضبط قبل وبعد <binary data>
المحتوى.