我正在尝试使用正则表达式获取电子邮件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"
的任何内容。
答案 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
(注意.
转义为与文字点匹配。)