Domanda

Sto cercando di fare un "preg partita tutto" sulla risposta qui sotto per ottenere tutti i dati binari. Ho provato quasi tutto ciò che si possa immaginare e per la vita di me, non si può ottenere nulla.

speravo che sarebbe stato semplice come fare qualcosa di simile:

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

Ma non riesco a ottenere nulla. Ho provato anche altre cose. \ R \ n | i s m U -. Io proprio non riesco a farlo per qualche motivo

Ecco una risposta pseudo non comprese le intestazioni:

--boundary
content-type:image/jpeg

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

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

<binary data>
--boundary

purtroppo i dati binari non è racchiuso con è solo dati grezzi con caratteri speciali nel corso di più linee ...

anche: Penso che il problema si trova all'interno i dati binari effettivo che viene visualizzato perché quando ho eseguito un match preg tutti sulla informazioni di cui sopra funziona bene, ma quando provo sulla dati effettivi che ha tutti i dati binari merda in esso, non funziona.

È stato utile?

Soluzione

In alternativa, è possibile analizzare con explode () questo dovrebbe essere molto più veloce, non è troppo complesso, e ti dà le informazioni di intestazione se si desidera che:

<?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);

Altri suggerimenti

\n dipende dalla piattaforma. Presumibilmente i dati è un http-request o una e-mail? In questo caso, le interruzioni di linea saranno \r\n, quindi è necessario verificare che, invece

Sei espressione sembra funzionare bene per me sui dati che hai fornito. Ho tirato il vostro output.php, e ribattezzata output.txt, poi corse questo script:

<?php

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

sembra aver funzionato bene, cioè stampato questo:

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 "ÿÙ" )ÿÙ
        )

)

Sembra che i $ matches [1] contiene l'elenco dei dati binari che stai cercando.

Non ho una risposta per quanto riguarda le espressioni regolari, ma hai avuto uno sguardo al Zend_Mime ?

Ok, beh io non sono tutto che la familiarità con PHP espressioni regolari ...

Considerando quello che si sta cercando di fare, passare il dot-incontri-nuova linea s dovrebbe funzionare. Utilizzando questa espressione regolare sembrava funzionare il mio fine:

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

Il *? dovrebbe essere non avido, e così sarà inghiottire solo tanto come per abbinare la prima stringa di testo confine --simple che vede.

I tuoi fine riga possono essere diversi dal mio (io sono su una macchina Windows), quindi potrebbe essere necessario accendere un editor esadecimale per vedere esattamente quello che dovrebbe essere abbinato prima e dopo il contenuto <binary data>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top