2012-05-28 34 views
0

我正在解析一個郵件頭,並且正在尋找「boundary = ...」參數。preg_match問題(不像我預期的那樣解析)

$content = '..Content-Type: multipart/alternative; 
    boundary="----=_NextPart_000_10CD_01CD3CB2.7C22E7C0" 
X-Mailer: Microsoft CDO for Windows 2000..' 

我用以下,但他們沒有工作:

$boundary = preg_replace('#(.*)boundary="(.*)"(.*)#is',"$2",$content); 

    $boundary = preg_replace('#boundary="(.*)"#i',"$2",$content); 

第一行返回:

NextPart_000_10CD_01CD3CB2.7C22E7C0" 
X-Mailer: Microsoft CDO for Windows 2000 

,而第二個:

Content-Type: multipart/alternative; 
    ----=_NextPart_000_10CD_01CD3CB2.7C22E7C0 
X-Mailer: Microsoft CDO for Windows 2000 

我明白第二行是什麼,並且它做正確的。但是,我不明白,第一行不解析第二個雙引號。任何想法?

+0

你想要做什麼,使用preg_match匹配還是使用preg_replace替換?你在混合它。 – Jeroen

+0

我不是真的用它替換,而是用於匹配,我猜 – capsula

+0

你的問題真的讓我意識到我不得不使用preg_match,我的壞:preg_match('#boundary =「(。*)」#i',$內容,$米); – capsula

回答

0

我可以使用負匹配[^「] *

$boundary = preg_replace('#(.*)boundary="([^"]*)(.*)#is',"$2",$content); 

但還是如果有人知道的回答我的問題,我們將不勝感激。我不完全理解的行爲,最終解決它(。*)使用s修正

1
preg_match('/boundary="([^"]+)"/m', $content, $m); 
echo $m[1]; // ----=_NextPart_000_10CD_01CD3CB2.7C22E7C0 
0

響應你的問題在你的自我回答:

.*,與s modifi使用時呃,還包括換行符iirc。

http://us3.php.net/manual/en/reference.pcre.pattern.modifiers.php

S(PCRE_DOTALL)

如果設定了此修正,在模式中的圓點元字符的所有字符,包括換行匹配。沒有它,換行符被排除在外。這個修飾符相當於Perl的/ s修飾符。否定類如[^ a]總是匹配換行符,與此修飾符的設置無關。