2015-05-09 105 views
0

我有一個HTML字符串。爲了這個目的,可以說該字符串是:preg_replace加上附加在開始和結束在src內替換cid:

<img id="Picture_x0020_1" src="cid:[email protected]" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">dflkjdslkjdsfldskfjdlfkjdlfksdjfflkdsjfdlkdfdjflkdfjdlkjfkdlfjdljfldjfldjflkdjjfkd<img id="Picture_x0020_1" src="cid:[email protected]" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">hkjhkhkhkhkhkjhjkhhkjhkjhkjhkjhjkhkjhkjhkhkjhkjhjkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjh<img id="Picture_x0020_1" src="cid:[email protected]" alt="Variety 008 (893 x 799) (223 x 200)" height="200" width="223">dsjhfdsjfdjflsjflkjdflkjffldskjfdljdlfkjflkdjflkdjfdslkjfkds 

現在讓我們看看字符串我需要做一些工作,這是Gmail保存圖像名稱中的src =「」:

CID:[email protected]

我使用的下載和類保存附件如下:

$cid = 'cid:[email protected]'; 
$mail_id . '_' . $cid . '_' . $image_id; 

所以實際形象的名字是這樣的: [email protected]_image001.jpg

現在我的目標是,以取代所有這些事件的:

CID:[email protected] .CF7A44B0

attachments/[email protected]_image001.jpg

實質上剝離了cid:string,將$ mail_id和_追加到字符串的開頭,_image001.jpg結束。

記住生病可能有一堆這些嵌入式CID SRC在HTML字符串

所以沒有用正則表達式這麼好我這樣做在嬰兒的步驟,首先,我試圖找出如何用附件/[email protected]替換cid:[email protected],然後試着弄清楚如何在最後添加_image001.jpg。

我設法建立,突出整體形象標識,在http://www.regexr.com/運行它,它不突出CID的正則表達式:在元素[1]值:

我想是這樣的,但它只是返回一個空字符串,但邏輯似乎在正則表達式工具,所以我無法弄清楚爲什麼它不工作,也許它是因爲正則表達式有3個元素,我需要訪問元素[1]獲取cid:值,不知道:

$string = preg_replace('/(<img\b\s+.*?src=\")(.*?cid:.*?)(\">)/g', 'attachments/'.$mail_id.'_', $html); 

但這裏的問題是我只需要更換cid:附件/ 308907_,我不想替換t他[email protected]部分。

我也不確定在最後追加_image.jpg的最佳方式。如果它只是一個替代我可以做這樣的事情:

$current_image_name = 'attachments/[email protected]'; 
$new_image_name = 'attachments/[email protected]_image001.jpg'; 

str_replace($current_image_name, $new_image_name,$html); 

但是因爲可能有很多,這些在電子郵件我不認爲這種做法會工作,它可能不是很好的性能明智的,因爲有些電子郵件可能在某些情況下很大。

我擔心的是,因爲它可能是一個很大的電子郵件解析,所以可能有一種方法與preg_replace函數同時執行的方法,因此調用效率不高。

如果有人甚至指出我在正確的方向,並給我一些關於實現這一目標的最佳方式的提示,我很高興能夠找出實際的代碼。

回答

2

嘗試此,

$re = "/src=\\\"cid:(.*?)@(.*?)\\\"/s"; 
$str = "<img id=\"Picture_x0020_1\" src=\"cid:[email protected]\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">dflkjdslkjdsfldskfjdlfkjdlfksdjfflkdsjfdlkdfdjflkdfjdlkjfkdlfjdljfldjfldjflkdjjfkd<img id=\"Picture_x0020_1\" src=\"cid:[email protected]\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">hkjhkhkhkhkhkjhjkhhkjhkjhkjhkjhjkhkjhkjhkhkjhkjhjkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjh<img id=\"Picture_x0020_1\" src=\"cid:[email protected]\" alt=\"Variety 008 (893 x 799) (223 x 200)\" height=\"200\" width=\"223\">dsjhfdsjfdjflsjflkjdflkjffldskjfdljdlfkjflkdjflkdjfdslkjfkds"; 
$subst = "src=\"attachments/".$mailid."[email protected]$2_$1\""; 

$result = preg_replace($re, $subst, $str); 

參見Regex

更新:

模式= /src=\"cid:(.*?)@(.*?)\"/s
src =匹配的字符src
\" =字符"匹配字面上
cid:=人物cid:

現在,我們必須從字符串捕捉圖像的名字,這樣我們就可以追加和它前面加上到輸出串匹配。圖像名稱可以在cid:@之間捕獲。

因此cid:(.*?)@會捕獲圖像名稱。這是該模式中的第一個捕獲組。 (即$1)。圖像名稱將被存儲到$1中,因爲它是第一個被捕獲的組)。如果您使用preg_match那麼它將是$match[1]

然後我們需要@"之間的字符串這是第二個捕獲組。所以@(.*?)"preg_replace 函數中被提及爲$2

preg_replace匹配的字符串將被存儲到$0,$1等等。在preg_match匹配的字符串將被存儲到$match[0]$match[1]等等。而$match是將在函數

+0

完美解析爲第三個參數的用戶定義的數組名,除非您在$ mailid缺少串聯的偉大工程。應該是這樣的:$ subst =「src = \」attachments /".$ mailid。「_ $ 1 @ $ 2_ $ 1 \」「;請更新,並接受答案,並讚揚。感謝您的幫助 – user1547410

+0

也爲了我和其他人的利益,你可以解釋$ subst線的情況。我知道發生了什麼事情,因爲它建立了帶有附件/ $ mailid_前綴的src字符串的開始,然後$ 1 @ $ 2我假設回聲圖片[email protected]部分,最後_ $ 1回聲顯示image001.jpg 我不明白的是你從哪裏建立$ 1,$ 2變量,是從$ re的regex的元素中拉出來的,還是它與substr函數有某些聯繫? – user1547410

+1

更新了我的答案,但如果您有任何疑問,請告訴我 – vidhya

相關問題