【发布时间】:2012-02-08 20:08:04
【问题描述】:
我有一组 if 语句搜索由 $html_part 定义的电子邮件的原始 hhtml 正文,它将替换电子邮件的 cid: text <img src="cid:image001.jpg@1REG5DS"> 与正在保存的实际图像的相对超链接。
问题是,如果邮件的 html 正文只包含 .jpg 图片,它们会按顺序编号,例如 image001.jpg、image002.jpg、image003.jpg。如果先有一个 .png 图像,然后是 2 个 .jpg 图像,它将变为 image001.png、image002.jpg、image003.jpg。 但目前我正在使用仅包含 3 个 .jpg 图像的电子邮件对其进行测试,但它会用第一个匹配的图像替换所有电子邮件的 cid 部分,而不是按顺序替换。现在它也被替换的图像在目录中,我有一个脚本,它会自动执行此操作。它从电子邮件中提取所有图像并将它们放在一个文件夹中。
if 语句有什么问题,为什么它们没有相应地替换?
/***************************** 1st image in email**********************************/
if (preg_match('/cid:([^"@]*).(png|jpg|gif|bmp)@([^"]*)/', $html_part, $m)){
$find = '/cid:([^"@]*).'.$m[2].'@([^"]*)/';
if ($m[2] == 'png') $replace = $png1;
if ($m[2] == 'jpg') $replace = $jpg1;
if ($m[2] == 'gif') $replace = $gif1;
if ($m[2] == 'bmp') $replace = $bmp1;
$html_part = preg_replace($find, $replace, $html_part);
}
if (preg_match('/cid:([^"@]*).(png|jpg|gif|bmp)@([^"]*)/', $html_part, $m)){
$find = '/cid:([^"@]*).'.$m[2].'@([^"]*)/';
if ($m[2] == 'png') $replace = $png2;
if ($m[2] == 'jpg') $replace = $jpg2;
if ($m[2] == 'gif') $replace = $gif2;
if ($m[2] == 'bmp') $replace = $bmp2;
$html_part = preg_replace($find, $replace, $html_part);
}
/***************************** 3rd image in email**********************************/
if (preg_match('/cid:([^"@]*).(png|jpg|gif|bmp)@([^"]*)/', $html_part, $m)){
$find = '/cid:([^"@]*).'.$m[2].'@([^"]*)/';
if ($m[2] == 'png') $replace = $png3;
if ($m[2] == 'jpg') $replace = $jpg3;
if ($m[2] == 'gif') $replace = $gif3;
if ($m[2] == 'bmp') $replace = $bmp3;
$html_part = preg_replace($find, $replace, $html_part);
}
【问题讨论】:
-
将限制较少的条件放在首位,然后继续使用最严格的条件(也许您的输入案例属于第一个条件,因为限制性更强)。另外,尝试使用 if/else 逻辑(不仅是 ifs)或 switch/case
-
您的第二个(和第三个) preg_match 是否与您刚刚在第一个(和第二个) preg_replace 中替换的字符串匹配?
-
@huelbois 这也是我的想法,并且 Kani 我也使用了 else 语句,但它仍然产生相同的结果
标签: php if-statement