Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
换行符前的php preg_匹配值或分号_Php_Regex_Email_Preg Match All - Fatal编程技术网

换行符前的php preg_匹配值或分号

换行符前的php preg_匹配值或分号,php,regex,email,preg-match-all,Php,Regex,Email,Preg Match All,我试图解析邮件头,但似乎找不到如何从邮件头中获取分号后有换行符的部分 例如: Content-Type: multipart/related; type="multipart/alternative"; boundary="----_=_NextPart_002_01CF36FC.6259F03C" 我正在使用preg_match_all中的以下正则表达式对此进行解析: /(?P<keyname>.*):(\s*)?(?<value>(?:(?!;).)

我试图解析邮件头,但似乎找不到如何从邮件头中获取分号后有换行符的部分

例如:

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_值内的边界线。 我也试过了

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

(?<sub_value>.*) 
但这并没有改变任何事情

.+|;[\s\\r\\n\\t]*<br>
与所有字符相同,或后面有换行符/制表符的分号

提前谢谢

编辑: 当我使用

(?<sub_value>([\w_.=\"\/\-;\s\\r\\n\\t]*))
我也得到了边界部分,但它得到的比它应该得到的更多,是否包含了可以出现在mailboundary中的所有字符? 此外,它捕捉到的新行没有分号。

试试这个:

$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);
您可以从中获得正则表达式的解释。当您尝试使用获取解释时,只需从正则表达式中删除?:P。

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

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

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

您希望匹配数组的外观如何?换句话说,您希望捕获什么?实际上,内容类型将进入“keyname”,而:后面的值将进入“value”。所有其他参数,这些参数在分号之后转换为sub_值,稍后将在代码中进行解析。但是,如果有另一个关键字,或者如何调用它,它需要进入另一个子数组,结果数组中将有另一个关键字。好的匹配数组如下所示:[keyname]=>Array[0]=>Content-Type[value]=>Array[0]=>multipart/related[sub_-value]=>Array[0]=>Type=multipart/alternative;boundary=-->谢谢您的回复!您提供的正则表达式几乎可以工作,但我需要对其进行一些编辑,因为我无法获得“内容传输编码:引用可打印”,其中“X-Http:ok”在您的示例中为:/?P[a-zA-Z0-9-]+:?P?:+[\s\n\r;]+??P[\s\s]*??=$|[a-zA-Z0-9-]+:/