Php 按域列出的唯一电子邮件地址
我试图使下面的功能只返回1电子邮件每个域 示例:如果我输入函数:Php 按域列出的唯一电子邮件地址,php,Php,我试图使下面的功能只返回1电子邮件每个域 示例:如果我输入函数: function remove_duplicates($str) { # match all email addresses using a regular expression and store them # in an array called $results preg_match_all("([\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7})",$str,$res
function remove_duplicates($str) {
# match all email addresses using a regular expression and store them
# in an array called $results
preg_match_all("([\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7})",$str,$results);
# sort the results alphabetically
sort($results[0]);
# remove duplicate results by comparing it to the previous value
$prev="";
while(list($key,$val)=each($results[0])) {
if($val==$prev) unset($results[0][$key]);
else $prev=$val;
}
# process the array and return the remaining email addresses
$str = "";
foreach ($results[0] as $value) {
$str .= "<br />".$value;
}
return $str;
};
email1@domain.com email2@domain.com email1@domain.com
email1@domain.com email3@test.co.uk
我要它回来
email1@domain.com email3@test.co.uk
以下是当前函数:
function remove_duplicates($str) {
# match all email addresses using a regular expression and store them
# in an array called $results
preg_match_all("([\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7})",$str,$results);
# sort the results alphabetically
sort($results[0]);
# remove duplicate results by comparing it to the previous value
$prev="";
while(list($key,$val)=each($results[0])) {
if($val==$prev) unset($results[0][$key]);
else $prev=$val;
}
# process the array and return the remaining email addresses
$str = "";
foreach ($results[0] as $value) {
$str .= "<br />".$value;
}
return $str;
};
函数删除重复项($str){
#使用正则表达式匹配所有电子邮件地址并存储它们
#在名为$results的数组中
preg\u match\u all(([\w-]+(?:\[\w-]+)*@(?:[\w-]+\)+[a-zA-Z]{2,7}),$str,$results);
#按字母顺序对结果排序
排序($results[0]);
#通过将重复结果与以前的值进行比较来删除重复结果
$prev=“”;
while(list($key,$val)=每个($results[0])){
如果($val==$prev)未设置($results[0][$key]);
else$prev=$val;
}
#处理阵列并返回剩余的电子邮件地址
$str=”“;
foreach($results[0]作为$value){
$str.=“
.”$value;
}
返回$str;
};
如何实现这一点有什么想法吗?您只需使用
array\u unique
功能即可完成以下工作:
$emails = explode(' ', $emailString);
$emails = array_unique($emails);
您只需使用
array\u unique
功能即可完成以下工作:
$emails = explode(' ', $emailString);
$emails = array_unique($emails);
除非所有相同的主机名都在一个连续序列中,否则概念
prev
是不可靠的。如果按照主机名进行排序,并提供排序功能,这会起作用,但这有点过头了
使用主机名构建阵列,删除阵列中已有主机名的条目。除非所有相同的主机名都在一个连续序列中,否则概念
prev
是不可靠的。如果按照主机名进行排序,并提供排序功能,这会起作用,但这有点过头了
使用主机名构建阵列,删除阵列中已有主机名的条目。大致如下:
$emails = array('email1@domain.com', 'email2@domain.com', 'email1@domain.com', 'email1@domain.com', 'email3@test.co.uk');
$grouped = array();
foreach ($emails as $email) {
preg_match('/(?<=@)[^@]+$/', $email, $match);
$grouped[$match[0]] = $email;
}
var_dump($grouped);
$emails=array('email1@domain.com', 'email2@domain.com', 'email1@domain.com', 'email1@domain.com', 'email3@test.co.uk');
$grouped=array();
foreach($email作为$email){
preg_match(‘/(?沿以下路线进行:
$emails = array('email1@domain.com', 'email2@domain.com', 'email1@domain.com', 'email1@domain.com', 'email3@test.co.uk');
$grouped = array();
foreach ($emails as $email) {
preg_match('/(?<=@)[^@]+$/', $email, $match);
$grouped[$match[0]] = $email;
}
var_dump($grouped);
$emails=array('email1@domain.com', 'email2@domain.com', 'email1@domain.com', 'email1@domain.com', 'email3@test.co.uk');
$grouped=array();
foreach($email作为$email){
preg_match('/(?我建议以下技巧/程序:
从一个字符串更改为地址数组。您可以使用preg\u match\u all
执行此操作,其他人可以使用explode
执行此操作,所有操作似乎都是有效的。因此,您已经有了此功能
从地址中提取域。你可以用正则表达式或其他东西再次这样做,我认为这很简单
现在检查该域是否已被使用,如果未被使用,请选择该电子邮件地址
最后一点可以通过使用数组和域作为键轻松完成。然后可以使用isset
查看它是否已经在使用
编辑:因为deceze选择了类似的答案(他覆盖了每个域的匹配项),下面的代码示例是一个小小的变化。由于您有字符串输入,我考虑一步一步地迭代它,以节省临时地址数组,并立即进行地址和域解析。要做到这一点,您需要注意偏移量,这是由preg_match
支持的。实际上,类似的事情是可能的但是,如果使用preg\u match\u all
,则可以再次使用数组
此代码将选择每个域的第一个地址并忽略其他地址:
$str = 'email1@domain.com email2@domain.com email1@domain.com email1@domain.com email3@test.co.uk';
$addresses = array();
$pattern = '/[\w-]+(?:\.[\w-]+)*@((?:[\w-]+\.)+[a-zA-Z]{2,7})/';
$offset = 0;
while (preg_match($pattern, $str, $matches, PREG_OFFSET_CAPTURE, $offset)) {
list(list($address, $pos), list($domain)) = $matches;
isset($addresses[$domain]) || $addresses[$domain] = $address;
$offset = $pos + strlen($address);
}
我建议采取以下技巧/步骤:
从一个字符串更改为地址数组。您可以使用preg\u match\u all
执行此操作,其他人可以使用explode
执行此操作,所有操作似乎都是有效的。因此,您已经有了此功能
从地址中提取域。你可以用正则表达式或其他东西再次这样做,我认为这很简单
现在检查该域是否已被使用,如果未被使用,请选择该电子邮件地址
最后一点可以通过使用数组和域作为键轻松完成。然后可以使用isset
查看它是否已经在使用
编辑:因为deceze选择了类似的答案(他覆盖了每个域的匹配项),下面的代码示例是一个小小的变化。由于您有字符串输入,我考虑一步一步地迭代它,以节省临时地址数组,并立即进行地址和域解析。要做到这一点,您需要注意偏移量,这是由preg_match
支持的。实际上,类似的事情是可能的但是,如果使用preg\u match\u all
,则可以再次使用数组
此代码将选择每个域的第一个地址并忽略其他地址:
$str = 'email1@domain.com email2@domain.com email1@domain.com email1@domain.com email3@test.co.uk';
$addresses = array();
$pattern = '/[\w-]+(?:\.[\w-]+)*@((?:[\w-]+\.)+[a-zA-Z]{2,7})/';
$offset = 0;
while (preg_match($pattern, $str, $matches, PREG_OFFSET_CAPTURE, $offset)) {
list(list($address, $pos), list($domain)) = $matches;
isset($addresses[$domain]) || $addresses[$domain] = $address;
$offset = $pos + strlen($address);
}
@deceze:是的,结束;)但是我在写这篇文章的时候没有读到你的答案。嘿,我差点对另一个答案发表同样的评论;)@deceze:是的,结束;)但是我在写这篇文章的时候没有读到你的答案。嘿,我差点对另一个答案发表同样的评论;)您可以反转电子邮件数组,然后选择第一个;)这是我的变体:您可以反转电子邮件数组,然后选择第一个;)这是我的变体: