0

次のようなインラインで表示されるhtml本文にあった実際の画像のbase64データから、電子メールのデータから画像を作成して保存しようとしています。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAE==">

しかし、変数 $html_part が電子メールの HTML 本文である HTML 本文に複数のイメージ タグがある可能性があるため、それらを順番に作成しようとしています。私が間違っていることを解決するための助けが必要です。

    $img_tags = preg_match('/<img\s+(.*)>/', $html_part, $num_img_tags);
    $num_img_tags = count($num_img_tags);

    echo $html_part;
    for ($i = 1; $i <= $num_img_tags; $i++) {       
    preg_match('/<img\s+(.*)\s+src="data:image\/(.*);(.*),(.*)"\s+(.*)>/i', $html_part, $srcMatch);
{   
    foreach($srcMatch[4] as $im_data)
    {
        $ufname = "image0".$num_img_tags.".jpg";
        echo "<h1>$ufname</h1>";
            $im_data = base64_decode($im_data);
            $im = imagecreatefromstring($im_data);
            if ($im !== false) {
            header('Content-Type: image/jpeg');
            imagejpeg($im, $ufname);
            imagedestroy($im);
            }
            else {
            echo 'An error occurred.';
            }
    }

}
}
4

2 に答える 2

1

preg_match ではなく、preg_match_all を使用することをお勧めします。

http://php.net/manual/en/function.preg-match-all.php

また、上記を使用した解決策。

<?php

$html_part=<<<END
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEWcZjTcViTMuqT8/vzcYjTkhhTkljT87tz03sRkZmS8mnT03tT89vTsvoTk1sz86uTkekzkjmzkwpT01rTsmnzsplTUwqz89uy0jmzsrmTknkT0zqT3X4fRAAAAbklEQVR4XnXOVw6FIBBAUafQsZfX9r/PB8JoTPT+QE4o01AtMoS8HkALcH8BGmGIAvaXLw0wCqxKz0Q9w1LBfFSiJBzljVerlbYhlBO4dZHM/F3llybncbIC6N+70Q7OlUm7DdO+gKs9gyRwdgd/LOcGXHzLN5gAAAAASUVORK5CYII=">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEWcZjTcViTMuqT8/vzcYjTkhhTkljT87tz03sRkZmS8mnT03tT89vTsvoTk1sz86uTkekzkjmzkwpT01rTsmnzsplTUwqz89uy0jmzsrmTknkT0zqT3X4fRAAAAbklEQVR4XnXOVw6FIBBAUafQsZfX9r/PB8JoTPT+QE4o01AtMoS8HkALcH8BGmGIAvaXLw0wCqxKz0Q9w1LBfFSiJBzljVerlbYhlBO4dZHM/F3llybncbIC6N+70Q7OlUm7DdO+gKs9gyRwdgd/LOcGXHzLN5gAAAAASUVORK5CYII=">
END;

preg_match_all('/<img.*?src="data:image\/.*;.*,(.*)".*?>/i', $html_part, $img_tags, PREG_PATTERN_ORDER);

echo $html_part;
$img_num = 0;
foreach($img_tags[1] as $im_data)
{
    $ufname = "image0".$img_num.".jpg";
    echo "<h1>$ufname</h1>";
    $im_data = base64_decode($im_data);
    $im = imagecreatefromstring($im_data);
    if ($im !== false) {
        imagejpeg($im, $ufname);
        imagedestroy($im);
    }
    else {
        echo 'An error occurred.';
    }
    $img_num++;
}
于 2012-04-09T00:24:04.760 に答える
1

あなたのコードは不可能です - 出力を実行した後にheader () 呼び出しを行うことはできません。また、同じ「ドキュメント」に複数の画像を出力することもできません。また、html (<h1>もの)、画像 (header('Content-type:...')など) をすべて同じドキュメント内に出力することはできません。

同様に、正規表現を使用して HTML を解析/処理することは危険です。ソース ドキュメントと正規表現の 1 つの不正な形式は、喜んでガベージを食べて、ガベージを生成します。HTMLで正規表現を使用しないでください...使用するたびに、アラン・チューリングは子猫を殺します. 代わりにDOM パーサーを使用してください。

于 2012-04-09T00:39:30.470 に答える