【问题标题】:Series of if statements functioning incorrectly一系列 if 语句运行不正确
【发布时间】: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


【解决方案1】:

您的 preg_replace 匹配 $html_part 中的所有 $find 实例。 但是在 $find 中,您只有 $m[2] 部分发生变化,您不会重新注入刚刚匹配的 $m[1]。

不确定,但你应该有这样的东西(未经测试):

$find = '/cid:'$m[1].'.'.'.$m[2].'@([^"]*)/';

【讨论】:

  • 谢谢!那行得通。我只需要修改您的示例代码:$find = '/cid:'.$m[1].'.'.$m[2].'@([^"]*)/'; 您在 $m[2] 附近有一个额外的单引号
【解决方案2】:

这不起作用的原因是preg_replace 替换了所有匹配项。您传入的正则表达式正在搜索具有相同扩展名的所有图像。

你有什么:

$find = '/cid:([^"@]*).'.$m[2].'@([^"]*)/';

/cid:([^"@]*).jpg@([^"]*)/ - match all jpgs

你想要的是:

$find = '/'.$m[0].'/';

/cid:image001.jpg@1REG5DS/ - match only this jpg file

【讨论】:

    【解决方案3】:

    改用:

    if(this is it){
    
    //somecode
    
    }elseif(this is it){
    
    //somecode
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多