如何从一个长string获取电子邮件地址

在PHP中,我有这样一个string:

$string = "user@domain.com MIME-Version: bla bla bla"; 

我如何获得电子邮件地址? 有没有简单的方法来获得值?

如果您不确定空格分隔string的哪一部分是电子邮件地址,则可以用空格分隔string并使用

 filter_var($email, FILTER_VALIDATE_EMAIL) 

在每个子string。

根据mandaleeka的回答,使用空格分隔符将string分开,然后使用filter_var进行清理,然后validation是否有合法的电子邮件地址:

 function extract_email_address ($string) { foreach(preg_split('/\s/', $string) as $token) { $email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL); if ($email !== false) { $emails[] = $email; } } return $emails; } 

基于康斯坦丁正则expression式..与IP地址域也工作。

 $pattern="/(?:[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; //$pattern="/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/"; $subject="Hello a@b.com francis a@b words francisfueconcillo@gmail.com words 2 words123 francis@192.168.0.1"; preg_match_all($pattern, $subject, $matches); 

更新@Rob Locken的答案:

 function extract_email_address ($string) { $emails = array(); $string = str_replace("\r\n",' ',$string); $string = str_replace("\n",' ',$string); foreach(preg_split('/ /', $string) as $token) { $email = filter_var($token, FILTER_VALIDATE_EMAIL); if ($email !== false) { $emails[] = $email; } } return $emails; } 

这个小的PHP脚本将帮助我们从长段落或文本中提取电子邮件地址。 只需复制粘贴这个脚本并保存为一个PHP文件(extract.php):

 $string="user@domain.com MIME-Version: bla bla bla"; $pattern="/(?:[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; preg_match_all($pattern, $string, $matches); foreach($matches[0] as $email){ echo $email.", "; } ?> 

上面的脚本会产生这样的结果:

 user@domain.com, 

如果电子邮件地址始终位于string的前面,最简单的方法是简单地将string分割为空格字符的所有实例,然后从结果数组中取第一个值。

当然,在使用它之前,请确保检查它是类似于电子邮件地址的东西。

有关详细信息,请参阅PHP的“分割”函数。

使用正则expression式筛选电子邮件地址非常棘手,因为有太多可能的允许字符。 它可以做到,但你可能需要调整一些,以得到你所需要的。

你可以从这样的事情开始:

 $string = "user@domain.com MIME-Version: bla bla bla"; $matches = array(); $pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/' preg_match($pattern,$string,$matches); 

然后$匹配应该包含您的电子邮件地址。

这对我工作

 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

检测string中的任何电子邮件地址

如果真的是空间分隔的话

 php > $matches = array(); php > preg_match('/^[^ ]*/', $string, $matches); php > print_r($matches[0]); user@domain.com 

看看PHP中的正则expression式 。

使用正则expression式,您可以识别给定string中的任何文本模式。 他们非常有用。 所以,即使你现在可以坚持从另一个答案复制代码片段,你应该考虑进一步挖掘。

起初可能有点复杂,但这绝对是值得的。

我还修改了@Rob Locke的回答。 我发现它不适合我,因为我必须先用逗号分隔空格。

 function extract_email_addresses($sString) { $aRet = array(); $aCsvs = explode(',', $sString); foreach($aCsvs as $sCsv) { $aWords = explode(' ', $sCsv); foreach($aWords as $sWord) { $sEmail = filter_var(filter_var($sWord, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL); if($sEmail !== false) $aRet[] = $sEmail; } } return $aRet; } 

匹配正则expression式,如 – ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([az]{3})或类似的东西。

 $text = 'First Last <name@example.com>' $emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));