0

我正在解析邮件标头,并且正在寻找“boundary=...”参数。

$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

我了解第二行的作用,并且做得正确。但是当第一行不解析第二个双引号时,我不明白。任何想法?

4

3 回答 3

1
preg_match('/boundary="([^"]+)"/m', $content, $m);
echo $m[1]; // ----=_NextPart_000_10CD_01CD3CB2.7C22E7C0
于 2012-05-28T15:13:35.163 回答
0

我终于可以使用否定匹配器 [^"]* 解决它

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

但是,如果有人知道我的问题的答案,将不胜感激。我不完全理解与 s 修饰符一起使用的 (.*) 的行为

于 2012-05-28T15:09:00.720 回答
0

在您的自我回答中回答您的问题:

.*,当与s修饰符一起使用时,还包括换行符 iirc。

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

s (PCRE_DOTALL)

如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。这个修饰符等价于 Perl 的 /s 修饰符。诸如 [^a] 之类的否定类始终匹配换行符,与此修饰符的设置无关。

于 2012-05-28T15:35:25.283 回答