Question

Je suis en train de faire « tout le match preg » sur la réponse ci-dessous un pour obtenir toutes les données binaires. Je l'ai essayé à peu près tout ce qu'on puisse imaginer et pour la vie de moi, ne peut pas obtenir quoi que ce soit.

J'espérais que ce serait aussi simple que de faire quelque chose comme ceci:

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

Mais je ne peux rien. J'ai essayé d'autres choses aussi. \ R \ n | i s U m -. Je ne peux pas le faire pour une raison quelconque

Voici une réponse pseudo non compris les en-têtes:

--boundary
content-type:image/jpeg

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

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

<binary data>
--boundary

Malheureusement, les données binaires ne sont pas jointe à <&> il est juste des données brutes avec des caractères spéciaux au cours de plusieurs lignes ...

aussi: je pense que le problème réside dans les données binaires réel qui est affiché parce que quand je lance un match preg tout sur les informations ci-dessus, il fonctionne très bien, mais quand je l'essayer sur les données réelles qui a toutes les données binaires merde dedans, ça ne fonctionne pas.

Était-ce utile?

La solution

Sinon, vous pouvez exploser avec analysez () cela devrait être beaucoup plus rapide, ce n'est pas trop complexe, et il vous donne l'info d'en-tête si vous le souhaitez:

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

Autres conseils

\n est dépendant de la plateforme. On peut supposer que vos données est une requête http ou un e-mail? Dans ce cas, les sauts de ligne seront \r\n, vous devez tester qu'au lieu

Vous êtes l'expression semble fonctionner très bien pour moi sur les données que vous avez fournies. Je baissai votre output.php, et rebaptisèrent sortie.txt, puis couru ce script:

<?php

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

Il semble avoir bien fonctionné, à savoir faire imprimer ceci:

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

)

On dirait les matchs de $ [1] contient la liste des données binaires que vous êtes après.

Je n'ai pas de réponse concernant vos expressions régulières, mais avez-vous un coup d'oeil à Zend_Mime ?

Ok, eh bien je ne suis pas tout familier avec PHP expressions régulières ...

Compte tenu de ce que vous essayez de faire, l'interrupteur du point-matches-retour à la ligne devrait fonctionner. En utilisant cette expression régulière semblait travailler sur ma fin:

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

*? devrait être non-gourmand, et il gobe que tant pour correspondre à la première chaîne de texte limite --simple voit.

Vos fins de ligne peuvent différer de la mienne (je suis sur une machine Windows), de sorte que vous pouvez avoir à tirer un éditeur hexadécimal pour voir exactement ce qui doit être adapté avant et après la teneur en <binary data>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top