0

以下の応答で「preg match 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 match all を実行すると問題なく動作しますが、すべてのバイナリデータがらくたを含む実際のデータで試してみると、うまくいきません。

4

5 に答える 5

2

\nプラットフォームに依存します。おそらくあなたのデータはhttpリクエストですか、それともメールですか?この場合、改行は になる\r\nので、代わりにそれをテストする必要があります

于 2009-09-06T11:48:19.227 に答える
1

別の方法として、explode() で解析することもできます。これははるかに高速で、複雑すぎず、必要に応じてヘッダー情報を提供します。

<?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);
于 2009-09-06T21:40:39.240 に答える
0

わかりました、まあ、私はPHPの正規表現にそれほど精通していません...

何をしようとしているのかを考えると、 dot-matches-newline s スイッチが機能するはずです。この正規表現を使用すると、私の側ではうまくいくように見えました:

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

*? 貪欲であってはならないので、最初に見た --simple 境界テキスト文字列に一致するようにのみゴブリングします。

あなたの行末は私のものとは異なる可能性があります (私は Windows マシンを使用しています)。そのため、<binary data>コンテンツの前後に何を一致させる必要があるかを正確に確認するには、16 進エディターを起動する必要がある場合があります。

于 2009-09-06T00:49:59.787 に答える
0

正規表現に関する回答はありませんが、Zend_Mimeはご覧になりましたか?

于 2009-09-05T23:48:19.247 に答える