Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按域列出的唯一电子邮件地址_Php - Fatal编程技术网

Php 按域列出的唯一电子邮件地址

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

我试图使下面的功能只返回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,$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:是的,结束;)但是我在写这篇文章的时候没有读到你的答案。嘿,我差点对另一个答案发表同样的评论;)您可以反转电子邮件数组,然后选择第一个;)这是我的变体:您可以反转电子邮件数组,然后选择第一个;)这是我的变体: