在PHP中,如何从文本块中提取多个电子邮件地址并将它们放入数组中?

2022-08-30 15:33:28

我有一个文本块,我想从中提取有效的电子邮件地址并将它们放入数组中。到目前为止,我有...

   $string = file_get_contents("example.txt"); // Load text file contents
   $matches = array(); //create array
   $pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'; //regex for pattern of e-mail address
   preg_match($pattern, $string, $matches); //find matching pattern

但是,我得到一个只有一个地址的数组。因此,我想我需要以某种方式循环完成此过程。我该怎么做?


答案 1

你已经非常接近了,但是正则表达式不会捕获所有电子邮件格式,并且您不需要指定A-Za-z,您只需使用“i”标志将整个表达式标记为不区分大小写。有些电子邮件格式的情况被遗漏了(特别是子域),但这抓住了我测试过的那些。

$string = file_get_contents("example.txt"); // Load text file contents

// don't need to preassign $matches, it's created dynamically

// this regex handles more email address formats like a+b@google.com.sg, and the i makes it case insensitive
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';

// preg_match_all returns an associative array
preg_match_all($pattern, $string, $matches);

// the data you want is in $matches[0], dump it with var_export() to see it
var_export($matches[0]);

输出:

array (
  0 => 'test1+2@gmail.com',
  1 => 'test-2@yahoo.co.jp',
  2 => 'test@test.com',
  3 => 'test@test.co.uk',
  4 => 'test@google.com.sg',
)

答案 2

我知道这不是你问的问题,但我注意到你的正则表达式不接受任何地址,如''或任何具有子域的地址。你可以用类似的东西替换它:myemail@office21.company.com

/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/

这将拒绝不太有效的电子邮件(尽管它并不完美)。

我还建议您阅读这篇关于电子邮件验证的文章,它非常好,内容丰富。


推荐