2012-02-08 66 views
0

我有一套if语句,用于搜索由$ html_part定义的电子邮件的原始hhtml正文,该语句将用相对超链接替换电子邮件的cid:文本<img src="cid:[email protected]">保存。if语句系列运行不正确

问题是,如果电子邮件的HTML正文仅包含.jpg图像,则会按顺序编号,如image001.jpg,image002.jpg,image003.jpg。如果这是一个.png图像,然后是2个.jpg图像,它会变成image001.png,image002.jpg,image003.jpg。 但目前我只用3张.jpg图像的电子邮件进行测试,但它会将所有电子邮件的cid部分替换为第一个匹配的图像,而不是按顺序排列。现在它被替换的图像是在我有一个side-script的目录中,这是自动完成的。它从电子邮件中提取所有图像,并将它们放在一个文件夹中。

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

把限制较少的条件** **第一,并与最严格的人继续(也许你的输入性病例正在下降在第一种情况下,因为更具限制性)。此外,尝试使用** if/else **逻辑(不仅ifs)或**开关/ case ** – Kani 2012-02-08 20:13:48

+0

是否可以让您的第二个(和第三个)preg_match匹配您刚才替换的字符串第一个(和第二个)preg_replace? – huelbois 2012-02-08 20:14:13

+0

@huelbois这就是我的想法,以及** Kani **我已经使用了else语句,并且它仍然产生相同的结果 – Tower 2012-02-08 20:17:32

回答

0

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

不知道,但你应该有这样的事情(未测试):

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

谢谢!这工作。我只需修改你的示例代码: '$ find ='/ cid:'。$ m [1]。'。'。$ m [2]。'((^“] *)/';' 您在$ m [2]附近有额外的单引号 – Tower 2012-02-08 20:33:40

0

使用,而不是:

if(this is it){ 

//somecode 

}elseif(this is it){ 

//somecode 
} 
0

这是不工作的原因是preg_replace替换所有比赛。你传入的正则表达式搜索所有具有相同扩展名的图像。

你有什么:

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

/cid:([^"@]*)[email protected]([^"]*)/ - match all jpgs 

你想要的是:

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

/cid:[email protected]/ - match only this jpg file