PHP正则表达式匹配多个电子邮件ID格式

时间:2017-03-23 05:07:49

标签: php regex

我正在尝试使用正则表达式获取电子邮件ID的本地部分。 这里的挑战是本地部分有两种不同的格式,我需要弄清楚我正在阅读哪种格式并准备该电子邮件ID的替代形式。一如既往,我的代码片段会粘贴在下面。

$testarray = array("user1@gmail.com", "user2.tp@gmail.com", "user3@gmail.com", "user4.tp@gmail.com", "user5.tp@gmail.com");

foreach($testarray as $emailID) {
  preg_match("/([\w\d]*)\.([\w\d]*)@gmail.com/", $emailID, $match);

  if ($match[2] == "tp") {
    $altform = $match[1] . "@gmail.com";
  } else {
    $altform = $match[1] . ".tp@gmail.com";
  }

  error_log("ALTERNATE FORM OF $emailID IS $altform");

}

我面临的问题是我没有得到所需的结果,因为$match[1]$match[2]都没有匹配"user1@gmail.com"的任何内容。

1 个答案:

答案 0 :(得分:1)

你需要在dot + word chars子模式周围使用一个可选组,然后在执行搜索后检查组是否匹配:

foreach($testarray as $emailID) {
    $altform = "";
    if (preg_match("/(\w+)(?:\.(\w+))?@gmail\.com/", $emailID, $match))
    {
        if (!empty($match[2]) && $match[2] == "tp") {
            $altform = $match[1] . "@gmail.com";
        } else {
            $altform = $match[1] . ".tp@gmail.com";
        }
    }
    print_r("ALTERNATE FORM OF $emailID IS $altform\n");
}

请参阅online PHP demo

关于模式的说明

  • (\w+) - 捕获第1组:一个或多个单词字符
  • (?:\.(\w+))? - 1次或0次出现(由于?量词):
    • \. - 一个点
    • (\w+) - 捕获第2组:一个或多个单词字符
  • @gmail\.com - 文字字符串@gmail.com(注意.转义为与文字点匹配。)