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

Php 创建/保存内联base64编码图像,php,image,base64,gd,Php,Image,Base64,Gd,我正在尝试从html正文中显示为内联的实际图像的base64数据创建和保存电子邮件中的数据中的图像,例如: <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAE=="> 但是我尝试按顺序创建它们,因为html正文中可能有多个图像标记,其中变量$html_部分是电子邮件的html正文。 我只是需要一些帮助来解决我做错了什么 $img_tags = preg_match('/<img\s+(.*

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

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

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

}
}
$img\u tags=preg\u match('//i',$html\u part,$srcMatch);
{   
foreach($srcMatch[4]作为$im_数据)
{
$ufname=“image0”。$num\u img\u标记。“.jpg”;
回显“$ufname”;
$im_data=base64_解码($im_data);
$im=imagecreatefromstring($im\u数据);
如果($im!==false){
标题(“内容类型:图像/jpeg”);
imagejpeg($im,$ufname);
图像处理(港币);;
}
否则{
回显“发生错误”;
}
}
}
}

非常确定您希望使用预匹配,而不是预匹配

另外,使用上述解决方案

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

您的代码是不可能的-您不能在执行了任何输出后执行header()调用。您也不能在同一“文档”中输出多个图像。您也不能在同一文档中输出html(内容类型:…)
内容、图像(
标题(
等等


同样,使用正则表达式解析/处理HTML是危险的。源文档和正则表达式的一个畸形将很高兴地享用垃圾并为您产生垃圾。不要在HTML上使用正则表达式…每次这样做时,Alan Turing都会杀死一只小猫。改用正则表达式。

标题和
内容不在最终输出中,它们是在这个例子中,我只是心不在焉地忘记排除了一些行。我理解你关于使用正则表达式的危险的困境,但是现在我们在这里,你能帮我找到一个解决方案吗?代码不是“不可能”,它几乎可以工作,只需抛出一些错误。imagejpeg($im,$ufname);不发送到浏览器,而是将其写入文件,因此它是一个html输出、多个文件保存和一个错误的标题。您的解决方案可行,但我收到一个
警告:imagecreatefromstring()[function.imagecreatefromstring]:空字符串或无效图像
错误,是否知道是什么原因导致了此错误?此外,我正在使用正文中包含3个图像的电子邮件进行测试,尽管正文中的所有img标记都具有相同的base64数据,但只会创建第二个图像,并且第一个和第三个图像会显示上述错误。我建议执行$img_标记的var_转储并确保其正确捕获标签