换行前的php preg_match值或分号

时间:2014-03-21 14:55:17

标签: php regex email preg-match-all

我正在尝试解析一个mailheader,但我似乎无法找到如何从分号中获取分号后的换行符。

示例:

Content-Type: multipart/related;
    type="multipart/alternative";
    boundary="----_=_NextPart_002_01CF36FC.6259F03C"

我正在使用preg_match_all中的以下正则表达式解析它:

/(?P<keyname>.*):(\s*)?(?<value>(?:(?!;).)+)((\s*)?;([\s\\r\\n\\t]*)?(?<sub_value>.*)))?/i

但这并没有给我sub_value中的边界线。 我也试过

(?<sub_value>(.+|;[\s\\r\\n\\t]*))

而不是

(?<sub_value>.*) 

但它不会改变任何东西。

.+|;[\s\\r\\n\\t]*<br>

与所有字符一样,或带有换行符/标签的分号

提前致谢!

编辑: 我正在使用时

(?<sub_value>([\w_.=\"\/\-;\s\\r\\n\\t]*))

我也获得了边界部分,但它的数量已经超过应有的数量,并且包含的​​所有字符都可以出现在邮件边界中? 此外,它在没有分号的情况下捕获换行符。

2 个答案:

答案 0 :(得分:0)

试试这个:

$headers = <<<EOT
Host: www.example.com
Content-Length: 9000
Content-Type: multipart/related;
    type="multipart/alternative";
    boundary="----_=_NextPart_002_01CF36FC.6259F03C"
X-Http: ok
EOT;

preg_match_all("/(?P<keyname>[a-zA-Z0-9-]+):(?P<value>.*?)[\n\r;]+(?P<sub_value>[\s\S]*?)(?=$|[a-zA-Z0-9-]+:)/", $headers, $match);

您可以从this link获取正则表达式的解释。当您尝试使用the link获取解释时,只需从正则表达式中删除(?:P<...>)

答案 1 :(得分:0)

根据 RFC1341 RFC1521我相信这个正则表达式包含可能的边界字符:

$regex = "/"
       . "(?P<keyname>.*)"
       . ":(\s*)?"
       . "(?<value>(?:(?!;).)+)"
       . "("
       . "(\s*)?;"
       . "([\s\\r\\n\\t]*)?"
       . "(?<sub_value>(['()+_,\-.:;?=\"\/\w\s\\r\\n\\t]*))"
       . ")?"
       . "/i";

编辑更新了RFC链接和正则表达式