2012-05-28 29 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]总是匹配换行符,与此修饰符的设置无关。