创建/保存内联 base64 编码图像


Creating/Saving an inline base64 encoded image

我正在尝试从电子邮件中的数据创建和保存图像,该图像来自内联出现的 html 正文中实际图像的 base64 数据,例如:

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

但我正在尝试按顺序创建它们,因为 html 正文中可能有多个图像标签,其中变量 $html_part 是电子邮件的 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.';
            }
    }
}
}

你的代码是不可能的 - 你不能在执行任何输出后进行 header() 调用。您也不能在同一"文档"中输出多个图像。您也不能在同一文档中输出html(<h1>的东西),图像(header('Content-type:...')等。

同样,使用正则表达式解析/处理 HTML 也很危险。源文档和正则表达式的单个畸形将愉快地享用垃圾并为您生产垃圾。不要在 html 上使用正则表达式...每次你这样做,艾伦图灵都会杀死一只小猫。请改用 DOM 解析器。

很确定你想使用preg_match_all,而不是preg_match

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++;
}