如何从长字符串中获取电子邮件地址

时间:2009-06-22 17:45:31

标签: php string email

在PHP中,我有一个这样的字符串:

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

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

14 个答案:

答案 0 :(得分:42)

在mandaleeka答案的基础上,使用空格分隔符打破字符串,然后使用filter_var进行清理,然后验证是否剩余的是合法的电子邮件地址:

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;
}

答案 1 :(得分:26)

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

filter_var($email, FILTER_VALIDATE_EMAIL)

在每个子字符串上。

答案 2 :(得分:15)

基于constantine regex ..也适用于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);

答案 3 :(得分:5)

更新@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;
}

答案 4 :(得分:4)

这个小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,

答案 5 :(得分:3)

使用正则表达式过滤电子邮件地址非常棘手,因为有太多可能允许的字符。它可以完成,但你可能需要调整它以获得你所需要的。

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

$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);

然后$ match应包含您的电子邮件地址。

答案 6 :(得分:2)

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

当然,在使用之前一定要检查它是否类似于电子邮件地址。

有关详细信息,请参阅PHP“拆分”功能。

答案 7 :(得分:1)

这对我有用

(?:[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])+)\])

检测字符串中的任何电子邮件地址

答案 8 :(得分:1)

$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));

答案 9 :(得分:0)

查看Regular expressions in PHP

使用正则表达式,您可以识别给定字符串中的任何文本模式。它们非常有用。因此,即使你现在可以坚持从另一个答案中复制粘贴代码片段,你应该考虑再挖一点。

起初可能有点复杂,但绝对值得付出努力。

答案 10 :(得分:0)

如果真的是空格分开的话:

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

答案 11 :(得分:0)

匹配正则表达式,例如 - ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([a-z]{3})或类似的东西。

答案 12 :(得分:0)

我还修改了@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;  
}

答案 13 :(得分:0)

以下解决方案是https://stackoverflow.com/a/47150078/3010827的修改版本,更易于理解

$text = 'First Last <name@example.com>';

// split the string into multiple parts base on a space separator
$parts = preg_split('/\s/', $text);

// Sanitize each part by removing invalid email characters. For example <joe.doe@email.com> will become joe.doe@email.com
$parts = filter_var_array($parts, FILTER_SANITIZE_EMAIL);

// Filter out invalid emails  for each part. Valid emails will be kept while invalid ones will be replaced by `false`
$emails = filter_var_array($parts, FILTER_VALIDATE_EMAIL);

// remove `false` values from the array of emails, that's the default behavior of array_filter without the optional callback function
$emails = array_filter($emails);