换行符前的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-]+:/