我正在尝试从电子邮件中的数据创建和保存图像,该图像来自内联出现的 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++;
}