正则表达式拆分电子邮件地址

mor*_*di3 11 php regex email preg-match

我需要一些关于php regex的帮助,我想将"johndoe @example.com"的电子邮件地址"拆分"为"johndoe"和"@ example.com"

到现在为止,我有了这个:preg_match('/<?([^<]+?)@/', 'johndoe@example.com', $matches); 我得到了Array ( [0] => johndoe@ [1] => johndoe)

那么我需要如何改变正则表达式呢?

Mic*_*ski 26

$parts = explode('@', "johndoe@example.com");

$user = $parts[0];
// Stick the @ back onto the domain since it was chopped off.
$domain = "@" . $parts[1];
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,`list($ name,$ _)= explode('@',$ email); $ domain ='@'.$ _;` - http://www.ideone.com/yHlz6 (3认同)
  • 电子邮件地址可以包含多个“ @”符号,如http://stackoverflow.com/questions/12355858/how-many-symbol-can-be-in-an-e-mail-address中所述 (2认同)

Bro*_*gan 8

之前的一些答案是错误的,因为有效的电子邮件地址实际上可以包含多个@符号,方法是在点分隔的引用文本中包含它.请参阅以下示例:

$email = 'a."b@c".d@e.f';
echo (filter_var($email, FILTER_VALIDATE_EMAIL) ? 'V' : 'Inv'), 'alid email format.';
Run Code Online (Sandbox Code Playgroud)

有效的电邮格式


可以存在多个分隔的文本块和多个@符号.这两个示例都是有效的电子邮件地址:

$email = 'a."b@c".d."@".e.f@g.h';
$email = '/."@@@@@@"./@a.b';
Run Code Online (Sandbox Code Playgroud)

基于Michael Berkowski的爆炸答案,此电子邮件地址如下所示:

$email = 'a."b@c".d@e.f';
$parts = explode('@', $email);
$user = $parts[0];
$domain = '@' . $parts[1];
Run Code Online (Sandbox Code Playgroud)

用户:a."b"
域名:@c".d


使用此解决方案的任何人都应该注意潜在的滥用 接受基于这些输出的电子邮件地址,然后将$ email插入数据库可能会产生负面影响.

$email = 'a."b@c".d@INSERT BAD STUFF HERE';
Run Code Online (Sandbox Code Playgroud)

只要filter_var首先用于验证,这些函数的内容才是准确的.

从左边:

这是一个简单的非正则,非爆炸性解决方案,用于查找未包含在分隔和引用文本中的第一个@.基于filter_var,嵌套分隔文本被视为无效,因此找到正确的@是一个非常简单的搜索.

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $a = '"';
    $b = '.';
    $c = '@';
    $d = strlen($email);
    $contained = false;
    for($i = 0; $i < $d; ++$i) {
        if($contained) {
            if($email[$i] === $a && $email[$i + 1] === $b) {
                $contained = false;
                ++$i;
            }
        }
        elseif($email[$i] === $c)
            break;
        elseif($email[$i] === $b && $email[$i + 1] === $a) {
            $contained = true;
            ++$i;
        }
    }
    $local = substr($email, 0, $i);
    $domain = substr($email, $i);
}
Run Code Online (Sandbox Code Playgroud)

这是隐藏在函数中的相同代码.

function parse_email($email) {
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
    $a = '"';
    $b = '.';
    $c = '@';
    $d = strlen($email);
    $contained = false;
    for($i = 0; $i < $d; ++$i) {
        if($contained) {
            if($email[$i] === $a && $email[$i + 1] === $b) {
                $contained = false;
                ++$i;
            }
        }
        elseif($email[$i] === $c)
            break;
        elseif($email[$i] === $b && $email[$i + 1] === $a) {
            $contained = true;
            ++$i;
        }
    }
    return array('local' => substr($email, 0, $i), 'domain' => substr($email, $i));
}
Run Code Online (Sandbox Code Playgroud)

正在使用:

$email = 'a."b@c".x."@".d.e@f.g';
$email = parse_email($email);
if($email !== false)
    print_r($email);
else
    echo 'Bad email address.';
Run Code Online (Sandbox Code Playgroud)

数组([local] => a."b @ c".x."@".de [domain] => @fg)

$email = 'a."b@c".x."@".d.e@f.g@';
$email = parse_email($email);
if($email !== false)
    print_r($email);
else
    echo 'Bad email address.';
Run Code Online (Sandbox Code Playgroud)

电子邮件地址不好


从右边:

在对filter_var进行一些测试并研究可接受的有效域名(主机名由点分隔)之后,我创建了这个函数以获得更好的性能.在有效的电子邮件地址中,最后一个@应该是真@,因为@符号永远不会出现在有效电子邮件地址的域中.

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $domain = strrpos($email, '@');
    $local = substr($email, 0, $domain);
    $domain = substr($email, $domain);
}
Run Code Online (Sandbox Code Playgroud)

作为一个功能:

function parse_email($email) {
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
    $a = strrpos($email, '@');
    return array('local' => substr($email, 0, $a), 'domain' => substr($email, $a));
}
Run Code Online (Sandbox Code Playgroud)

或使用爆炸和内爆:

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $local = explode('@', $email);
    $domain = '@' . array_pop($local);
    $local = implode('@', $local);
}
Run Code Online (Sandbox Code Playgroud)

作为一个功能:

function parse_email($email) {
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
    $email = explode('@', $email);
    $domain = '@' . array_pop($email);
    return array('local' => implode('@', $email), 'domain' => $domain);
}
Run Code Online (Sandbox Code Playgroud)