PHP Düzenli İfadeler (REGEX) Multipart MIME (NOT-EMAIL)

5 Cevap php

Ben tüm ikili verileri almak için aşağıdaki cevabı üzerine "gebelik maçı tüm" yapmaya çalışıyorum. Ben hemen hemen her şeyi hayal denedim ve bana hayat için, bir şey elde edemezsiniz.

Ben böyle bir şey yapıyor gibi basit olacağımızı umuyordum:

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

Ama ben bir şey elde edemezsiniz. Ben çok başka şeyler denedim. \ R \ n | ism U - Ben sadece nedense alınamıyor.

İşte başlıklar dahil değil sözde bir yanıttır:

--boundary
content-type:image/jpeg

<binary data>
--boundary
content-type:image/jpeg

<binary data>
--boundary
content-type:image/jpeg

<binary data>
--boundary

ne yazık ki ikili veri ile kapalı değil < & > Birden çok hatları boyunca özel karakterler ile sadece ham veri var ...

ayrıca: ben sorun i tüm yukarıda bilgiler bir gebelik maç çalıştırdığınızda gayet güzel çalışıyor ama, çünkü görüntülenen ediliyor gerçek bir ikili veri içinde yatıyor düşünüyorum ben bunun tüm ikili veri bok olan gerçek veri üzerinde çalıştığınızda , çalışmıyor.

5 Cevap

Alternatif olarak, siz) bu çok karmaşık değil, çok daha hızlı olmalı ve bunu isterseniz size başlık bilgisi verir (patlayabilir ile ayrıştırmak:

<?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 platform bağımlıdır. Muhtemelen veri bir http isteği veya bir e-posta mı? Bu durumda, satır sonları \r\n olacak, böylece yerine bunun için test etmek gerekir

Sen ifade sağlanan verilere benim için ince iş gibi görünüyor demektir. Ben bu senaryoyu koştu, sonra dosya.php aşağı çekti, ve çýktý.txt değiştirildi:

<?php

$body = file_get_contents('output.txt');
$boundary = '__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__';
preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches);
print_r($matches);

Bu basılmış, yani ince çalışmış gibi görünüyor:

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] sonra konum ikili veri listesini içeren $ maçı gibi görünüyor.

Ben düzenli ifadeler ile ilgili bir cevap yok, ama Zend_Mime bir göz var mı?

Tamam, iyi ben PHP düzenli ifadeler ile tüm bu aşina değilim ...

Yapmaya çalıştığınız ne düşünüyor, dot-maçı-NewLine s anahtarı çalışması gerekir. Bu düzenli ifade kullanarak benim ucunda çalışmak gibiydi:

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

*? olmayan açgözlü olmalı ve ilk uyacak şekilde sadece bu kadar süpürmek olacak - gördüğü basit sınır metin dizesi.

Sizin satır sonları (Ben bir Windows makinede değilim) madenden farklı olabilir, bu nedenle önce ve <binary data> sonra içeriği uyumlu olmalıdır tam olarak ne görmek için bir hex editörü ateşlemek zorunda kalabilirsiniz.