Pergunta

Estou tentando fazer uma "correspondência preg all" na resposta abaixo para obter todos os dados binários. Eu tentei praticamente tudo que se possa imaginar e, para a minha vida, não posso conseguir nada.

Eu esperava que fosse tão simples quanto fazer algo assim:

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

Mas eu não posso conseguir nada. Eu tentei outras coisas também. r n | ism u - eu simplesmente não consigo entender por algum motivo.

Aqui está uma pseudo resposta que não inclui os cabeçalhos:

--boundary
content-type:image/jpeg

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

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

<binary data>
--boundary

Infelizmente, os dados binários não estão fechados com <&> são apenas dados brutos com caracteres especiais ao longo de várias linhas ...

Além disso: acho que o problema está dentro dos dados binários reais que estão sendo exibidos porque, quando eu executo uma correspondência pré -D. , não funciona.

Foi útil?

Solução

Como alternativa, você pode analisar com explode () isso deve ser muito mais rápido, não é muito complexo e fornece as informações do cabeçalho se você quiser:

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

Outras dicas

\n é dependente da plataforma. Presumivelmente, seus dados são uma solicitação http ou um email? Nesse caso, as quebras de linha serão \r\n, então você precisa testar para isso

Sua expressão parece funcionar bem para mim nos dados que você forneceu. Puxei sua saída.php e renomeei -o em output.txt, depois executei este script:

<?php

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

Parece ter funcionado bem, ou seja, imprimiu o seguinte:

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

)

Parece que o $ Matches [1] contém a lista de dados binários que você procura.

Não tenho uma resposta sobre suas expressões regulares, mas você deu uma olhada Zend_mime?

Ok, bem, não estou tão familiarizado com as expressões regulares do PHP ...

Considerando o que você está tentando fazer, o comutador Dot-Matches-Newline deve funcionar. Usar esta expressão regular parecia funcionar do meu lado:

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

O *? Deve ser não-greedoso e, portanto, ele devorará apenas para corresponder à primeira string de texto de limite simples que ele vê.

Suas finais de linha podem diferir do meu (estou em uma máquina Windows), então você pode ter que iniciar um editor hexadecimal para ver exatamente o que deve ser correspondido antes e depois do <binary data> contente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top