【问题标题】:Strip e-mail addresses from a string in PHP从 PHP 中的字符串中删除电子邮件地址
【发布时间】:2012-02-08 01:03:33
【问题描述】:

我为一家从 Postfix 接收邮件并使用 PHP 脚本将邮件插入数据库的律师事务所操作电子邮件存档。这工作得很好,但有时我用来从 From、To 和 Cc 标头解析电子邮件地址的正则表达式无法以 100% 的准确度捕获电子邮件地址。我已经尝试过在 stackoverflow 上提出的其他解决方案(使用 filter_var(),使用 imap_rfc822_parse_adrlist,使用问题 1028553 中的正则表达式),但实际上没有我所拥有的成功。

我希望尽量减少系统调用(我现在使用的 preg 太多了)并提高准确性。当前函数接受标题文本(From、To 或 Cc 字段)的输入,并返回去掉括号、引号、cmets 等的“干净”电子邮件地址。

任何人都可以提供任何帮助将不胜感激,因为我很难过!

温迪

我的功能:

function return_proper ($email_string) {
if (is_array($email_string)) {
    $x = "";
    foreach ($email_string as $val) {
        $x .= "$val,";
    }
    $email_string = substr($x, 0, -1);
}

$email_string = strtolower(preg_replace('/.*?([A-Za-z0-9\_\+\.\'-]+@[A-Za-z0-9\.-]+).*?/', '$1,', $email_string));
$email_string = preg_replace('/\>/', "", $email_string);
$email_string = preg_replace('/,$/', "", $email_string);
$email_string = preg_replace('/^\'/', "", $email_string);
return $email_string;
}

【问题讨论】:

  • 你有一些文本失败的例子吗?
  • 又一个正则表达式...但它是一个很好的;看看 Hexillion 提供的那些:hexillion.com/samples - 将其与 PHP 之类的 getmxrr 函数混合使用,以确保域具有有效的 MX 记录,您可能不会出错。
  • 我在下面提供了一些示例......原始输入字符串在顶部,然后是函数的结果。它大部分有效,但我想简化为一个 preg_match_all 并可能更好地捕捉其中一些错误。
  • [11-Jan-2012 11:36:14] (邮件传递系统)[11-Jan-2012 11:36:14] mailer- daemon@zcsmcmailsec01.ensue.com,(邮件传递系统)(在这种情况下,该函数不会去除“,(邮件传递系统)”文本
  • 我可能在想这个有点倒退,但你想要的是只从给定字符串中提取有效电子邮件部分的东西......所以为什么不在开始时寻找带有通配符的匹配项/ end 但只匹配 erm... 匹配的位。像/^.*([VALID_EMAIL_REGEXP_PART).*$/ 这样的东西基本上是这样的,所以电子邮件地址之前或之后的任何无效字符都被删除了?可能需要一些使用 PHP 贪婪/不贪婪的 RegExps 的研究,但它应该工作。

标签: php email smtp email-address rfc822


【解决方案1】:
function return_proper($email_string) {
    if (is_array($email_string)) {
        // Deal with array
        foreach ($email_string as $email_string_line) {
            $results[] = return_proper($email_string_line);
        }

        $result = implode(',', $results);
    } else {
        preg_match_all('/[A-Za-z0-9\_\+\.\'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]+/', $email_string, $matches);

        $result = implode(',', $matches[0]);
    }

    return strtolower($result);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 2013-05-22
    • 2012-12-12
    • 2023-04-07
    • 2017-10-10
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多