2012-02-08 100 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