如何从sql导出文本中提取合格的电子邮件?

时间:2018-01-20 03:14:58

标签: php regex csv email preg-match-all

我有一个像这样的文本块:

(2843, '', 0, '', '', '', '', 'mail@yahoo.gr', '', ''),
(2844, '', 0, '', '', '', '', 'mail1@washpost.com', '', ''),
(2845, '', 0, '', '', '', '', 'someMail@gmail.com', '', ''),
(2846, '', 0, '', '', '', '', 'else@gmail.gov', '', ''),

如何提取以.gov结尾的所有电子邮件地址?

我希望有一串以逗号分隔的值作为结果。像这样:

else@gmail.gov,nextElse@gmail.gov

2 个答案:

答案 0 :(得分:0)

  preg_match("/[\w.+\-]+@gmail\.gov/", $input, $output);

$ output将包含所有匹配的电子邮件。然后在PHP中,您可以使用for循环获取并在电子邮件之间添加逗号。

修改

$str = "(2843, '', 0, '', '', '', '', 'mail@yahoo.gr', '', ''),
(2844, '', 0, '', '', '', '', 'mail1@gmail.gov', '', ''),
(2845, '', 0, '', '', '', '', 'someMail@gmail.gov', '', ''),
(2846, '', 0, '', '', '', '', 'else@gmail.gov', '', '')";

preg_match_all("/[\w.+\-]+@gmail.gov/", $str, $output);

$final_str="";
foreach($output[0] as $email){
    $final_str .= $email.",";
}   
$final_str = rtrim($final_str,","); //Remove last comma
echo $final_str;

输出:     mail1@gmail.gov,someMail@gmail.gov,else@gmail.gov

答案 1 :(得分:0)

根据您的示例输入和您的标准,这将告诉正则表达您的意图:

/[^']+\.gov(?=')/

匹配所有非撇号字符,后跟.gov后跟(不捕获)'

然后用逗号破坏输出数组。

或更少的步骤:

/^(?:[^,]*, ){7}'\K[^']+\.gov(?=')/m

模式演示:https://regex101.com/r/nmNjZb/1/

这将从每行的开头逐字逐句地匹配。

代码:(演示:https://3v4l.org/por3g

$csv="(2843, '', 0, '', '', '', '', 'mail@yahoo.gr', '', ''),
(2844, '', 0, '', '', '', '', 'mail1@washpost.com', '', ''),
(2845, '', 0, '', '', '', '', 'someMail@gmail.com', '', ''),
(2846, '', 0, '', '', '', '', 'else@gmail.gov', '', ''),
(2846, '', 0, '', '', '', '', 'nextElse@gmail.gov', '', '')";
echo implode(',',preg_match_all("/^(?:[^,]*, ){7}'\K[^']+\.gov(?=')/m",$csv,$out)?$out[0]:[]);

输出:

else@gmail.gov,nextElse@gmail.gov