【问题标题】:Get email address from mailbox string从邮箱字符串中获取电子邮件地址
【发布时间】:2010-09-03 18:07:07
【问题描述】:

我需要从这个邮箱字符串中提取电子邮件地址。 我想到了str_replace,但显示名称和电子邮件地址不是静态的,所以我不知道如何使用正则表达式来做到这一点。

示例:“My name <email@example.com>”应生成“email@example.com”。

有什么想法吗?

谢谢 马蒂

【问题讨论】:

  • My name <email@example.com> 无效;根据 RFC 822,它必须是 "My name" <email@example.com>

标签: php regex email


【解决方案1】:

您可以使用imap_rfc822_parse_adrlist 来解析该地址:

$addresses = imap_rfc822_parse_adrlist('My name <email@gmail.com>');

【讨论】:

  • PHP 以惊人的晦涩函数列表来拯救世界。 :)
  • 是的,我记得easter_date() 那个代码高尔夫问题的答案(现在已经消失了)。
【解决方案2】:

从表面上看,以下是可行的:

preg_match('~<([^>]+)>~',$string,$match);

但我偷偷地怀疑你需要比这更好的东西。那里有大量“官方”电子邮件正则表达式模式,您应该更具体地了解匹配的上下文和规则。

【讨论】:

  • 在我的应用程序中,我个人在括号后使用 *,以确保所有电子邮件地址格式匹配,即使用户没有指定标题和电子邮件地址
【解决方案3】:

如果您知道字符串被&lt;&gt; 包围,您可以简单地根据它进行拆分。

这假设您将始终只有一对 &lt;&gt; 围绕字符串,并且不能确保结果是电子邮件模式。

否则您可以随时阅读email regex patterns

【讨论】:

    【解决方案4】:

    或查找正则表达式 (preg_match)。

    类似:[^])>;

    【讨论】:

      【解决方案5】:

      我来自一个正则表达式对于轻松提取字符串来说非常昂贵的时间和项目。

      $s = 'My name <email@gmail.com>';
      $s = substr(($s = substr($s, (strpos($s, '<')+1))), 0, strrpos($s, '>'));
      

      结果

      email@gmail.com
      

      【讨论】:

      • 这对我来说似乎很危险,因为名称可能包含“”字符。 strrpos 而不是 strpos 将避免这个问题。
      猜你喜欢
      • 2017-10-10
      • 2023-04-03
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2013-11-22
      相关资源
      最近更新 更多