2012-02-08 3 views
0

У меня есть набор операторов if, которые выполняют поиск по сырому телу hhtml электронной почты, заданного $ html_part, который заменит электронный адрес электронной почты: текст <img src="cid:[email protected]"> с относительной гиперссылкой на фактическое изображение, которое сохранены.Операции с неверными операциями

Проблема в том, что если тело html электронной почты содержит только изображения .jpg, они нумеруются последовательно, такие как image001.jpg, image002.jpg, image003.jpg. Если theres a .png изображение сначала, то 2 .jpg изображения, следующие за ним, это станет, image001.png, image002.jpg, image003.jpg. Но на данный момент я тестирую его с помощью электронной почты с изображениями только 3. .jpg, но вместо всех последовательно заменяемых частей электронной почты электронной почты заменяется первым совпадающим изображением. Теперь образ, который он должен заменить, находится в каталоге, для которого у меня есть боковой скрипт, который делает это автоматически. Он извлекает все изображения из электронной почты и помещает их в папку.

Что не так с утверждениями 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) или ** switch/case ** – Kani

+0

Возможно, ваш второй (и третий) preg_match соответствует строке, которую вы только что заменили в первый (и второй) preg_replace? – huelbois

+0

@huelbois Это то, что я тоже думаю, и ** Kani ** Я также использовал инструкции else, и все же он дает тот же результат – Tower

ответ

0

Ваш preg_replace соответствует ALL экземпляр $ найти в $ html_part. Но в $ find у вас есть только часть $ m [2], вы не заново установите $ m [1], который вы только что согласовали.

Не уверен, но вы должны иметь что-то вроде этого (не проверено):

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

Спасибо! Это сработало. Мне просто пришлось изменить код примера: '$ find = '/ cid:'. $ M [1]. '.'. $ M [2]. '@ ([^"] *) /'; ' У вас была дополнительная одиночная цитата рядом с $ m [2] – Tower

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 
Смежные вопросы