【问题标题】:Parse e-mail addresses with PHP?用 PHP 解析电子邮件地址?
【发布时间】:2011-11-27 19:11:12
【问题描述】:

类似于this question,我如何解析这种格式的电子邮件地址,

"Bob Smith" <bob@company.com>, joe@company.com, "John Doe"<john@company.com>

得到这样的结果:

array(
    'bob@company.com'=>'Bob Smith'
    'joe@company.com'=>''
    'john@company.com'=>'John Doe'
);

【问题讨论】:

标签: php regex parsing email


【解决方案1】:

对于类似的任务,我使用了以下正则表达式:

\s*(?:"([^"]*)"|([^,""<>]*))?\s*(?:(?:,|<|\s+|^)([^<@\s,]+@[^>@\s,]+)>?)\s*

https://regex101.com/r/Lpsjmr/1

PHP 代码:

$str = '"Bob Smith" <bob@company.com>, joe@company.com, "John Doe"<john@company.com>, Billy Doe<billy@company.com>';
if (preg_match_all('/\s*(?:"([^"]*)"|([^,""<>]*))?\s*(?:(?:,|<|\s+|^)([^<@\s,]+@[^>@\s,]+)>?)\s*/', $str, $matches, PREG_SET_ORDER) > 0) {
    $matches = array_map(function($x) { return [$x[1] . $x[2], $x[3]]; }, $matches);
    print_r($matches);
}

【讨论】:

    【解决方案2】:

    这应该适用于任何东西:

    $str = '"Bob Smith" <bob@company.com>, joe@company.com, "John Doe"<john@company.com>, Billy Doe<billy@company.com>';
    $emails = array();
    
    if(preg_match_all('/\s*"?([^><,"]+)"?\s*((?:<[^><,]+>)?)\s*/', $str, $matches, PREG_SET_ORDER) > 0)
    {
        foreach($matches as $m)
        {
            if(! empty($m[2]))
            {
                $emails[trim($m[2], '<>')] = $m[1];
            }
            else
            {
                $emails[$m[1]] = '';
            }
        }
    }
    
    print_r($emails);
    

    结果:

    Array
    (
        [bob@company.com] => Bob Smith
        [joe@company.com] => 
        [john@company.com] => John Doe
        [billy@company.com] => Billy Doe
    )
    

    【讨论】:

    • 我喜欢简洁,但它不处理名称部分中的逗号,例如 '"Smith, Bob" '
    【解决方案3】:

    这是一段完整的代码,甚至可以验证电子邮件是否正确;)

    <?php
    $mails = '"Bob Smith" <bob@company.com>, joe@company.com, "John Doe"<john@company.com>';
    
    $records = explode(",",$mails);
    
    foreach($records as $r){
      preg_match("#\"([\w\s]+)\"#",$r,$matches_1);
      $name = $matches_1[1];
    
    
      preg_match("/[^0-9<][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}/i",$r,$matches_2);
      $email = $matches_2[0];
    
      echo "Name: $name <br /> Email: $email <br />";
    }
    
    ?>
    

    【讨论】:

      【解决方案4】:

      好吧,您可以使用mailparse_rfc822_parse_addresses(),它就是这样做的。它是一个 PECL 扩展,因此使用 cmets 中提到的Mail_RFC822::parseAddressList() 可能更容易。

      【讨论】:

        【解决方案5】:
        1. 用逗号分解字符串
        2. 如果电子邮件有效,则存储它,如果否
          1. rtrim '>' 字符
          2. 按'
          3. 修剪 ('"' 和 ' ') 的字符串

        【讨论】:

        • 我想说这行不通。但我认为它会工作得很好!开始编码。
        • 如果您想获取姓名和电子邮件,这不太好用。名称可能是“Ballinger,John ,电子邮件 2”,但对于纯粹接收电子邮件,它还不错。 (我想要姓名和电子邮件,无法安装 PHP 扩展。)
        猜你喜欢
        • 2011-05-14
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 2019-09-10
        • 2013-09-01
        • 2011-12-08
        相关资源
        最近更新 更多