2012-02-08 34 views
0

$ html_partで定義された電子メールの生のhhtml本文を検索する一連のif文があります。これは電子メールのcid:text <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部分を置き換えます。これで置き換えられるイメージは、ディレクトリ内にあります。これにはサイドスクリプトがあり、自動的にこれが実行されます。電子メールからすべてのイメージを抽出し、フォルダに配置します。

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

は(多分あなたの入力ケースが落ちている**最初に**以下の制約条件を入れて、最も限定的なものを継続より制限的であるため、第1の条件の範囲内で)。また、** if/else **ロジック(ifsだけでなく)、** switch/case ** – Kani

+0

を使用してみてください。2番目(3番目)のpreg_matchが、最初の(そして2番目の)preg_replace? – huelbois

+0

@huelboisそれは私も同様に考えています。** Kani **私はelse文も使用しましたが、それでも同じ結果が得られます。 – Tower

答えて

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

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 
関連する問題