سؤال

أحاول القيام بـ "مطابقة 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> المحتوى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top