【问题标题】:PHP Regex to get multiline value out of Email HeaderPHP Regex 从电子邮件标题中获取多行值
【发布时间】:2012-09-25 21:52:54
【问题描述】:

我有一个简单的问题。如何从多行的电子邮件标题中获取值?

这是电子邮件标题中的示例主题值:

Subject: =?UTF-8?B?RGVhbHMgZm9yIHRoZSBEYXkgfCBQbHVzLCBzYXZlIDI1JSBvbiA=?=
   =?UTF-8?B?bmVhcmx5IEVWRVJZVEhJTkch?=
MIME-Version: 1.0

我正在使用以下正则表达式,但它只返回一行:

'/Subject: (.*)/i'

现在我尝试使用以下内容并返回两行,但是当主题只有一行时,它会返回其他不需要的标题信息(MIME-Version ...)。

'/Subject: (.*)(\n\s*(.*))/i'

如果正则表达式以空格 (\s*) 开头并且可以跨越多行,即如果“主题”的长度不同,我如何修改正则表达式以仅拉出第二行。

感谢您的帮助!

更新解决方案

感谢@G-Nugget,下面是一个正则表达式,它可以做我想做的事情并对结果进行分组:

 /Subject: ((.*)(\n\s+(.*))*)/i

【问题讨论】:

  • 使用能正确解析邮件头的库,现有选项请参见 PHP 手册。

标签: php regex email


【解决方案1】:

您的第二个正则表达式已接近。这个修改后的版本应该可以解决问题:

/Subject: (.*)(\n\s+(.*))*/i

通过将中间的* 切换为+,行首必须有一个空格才能抓住它。末尾的* 允许正则表达式匹配任意数量的行,只要除第一行以外的所有行都以空格开头。

【讨论】:

  • 感谢您的建议!不幸的是,如果主题在单行上,这似乎不起作用。它返回一个空数组。
  • @thiesdiggity 我的错,我正在用修复和奖励更新我的答案。
  • 行得通!我用最终的正则表达式更新了我的问题。我对其进行了一些修改以结合结果。
  • 谨慎使用此解决方案,因为它可能会意外匹配“AnythingSubject: ...”。请参阅下面的答案。
【解决方案2】:

我强烈建议使用带有“m”修饰符和“^”的正则表达式仅在行首进行搜索:

/^Subject: (.*)(\n\s+(.*))*/im

避免匹配与预期完全不同的标题 - 例如:

“X-Subject”而不是“Subject”

“X-Google-DKIM-Signature”而不是“DKIM-Signature”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多