使用正则表达式从电子邮件地址中提取用户名

mrp*_*atg 28 php regex preg-match

我的文本字符串如下所示:

johndoe@domain.com (John Doe)
Run Code Online (Sandbox Code Playgroud)

我需要在@之前得到正确的部分而不是别的.如果重要的话,文本来自一个简单的XML对象.

我的代码看起来像这样:

$authorpre = $key->{"author"};
$re1 = '((?:[a-z][a-z]+))';

if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches))
{
    $author = $matches[1][0];
}
Run Code Online (Sandbox Code Playgroud)

有时用户名可能在@符号前面有数字或下划线,这正是正则表达式停止的地方.

Wel*_*bog 82

正则表达式将匹配并捕获任何字符,直到它到达@字符:

([^@]+)
Run Code Online (Sandbox Code Playgroud)

这似乎是你需要的.它将处理电子邮件地址上各种各样的怪异变化.


我不确定为什么Ben James删除了他的答案,因为我觉得它比我的好.我要在这里发布(除非他取消回答):

为什么使用正则表达式而不是字符串函数?

$parts = explode("@", "johndoe@domain.com");
$username = $parts[0];
Run Code Online (Sandbox Code Playgroud)

在这种情况下你根本不需要正则表达式.我认为个人使用explode是一个更好的选择.


正如JohannesRössel在评论中指出的那样,电子邮件地址解析相当复杂.如果你想100%确定你能够处理任何技术上有效的电子邮件地址,你将不得不编写一个能够正确处理报价的例程,因为我的答案中列出的两个解决方案都会窒息地址如"a@b"@example.com.可能有一个库为您处理这种解析,但我不知道它.

  • 什么是电子邮件地址`"a @ b"@ example.com`? (3认同)

gho*_*g74 6

@OP,如果你只想在@之前得到所有东西,只需使用字符串/数组方法.不需要复杂的正则表达式.爆炸"@",然后删除作为域部分的最后一个元素

$str = '"peter@john@doe"@domain.com (John Doe)';
$s = explode("@",$str);
array_pop($s); #remove last element.
$s = implode("@",$s);
print $s;
Run Code Online (Sandbox Code Playgroud)

产量

$ php test.php
"peter@john@doe"
Run Code Online (Sandbox Code Playgroud)


Lek*_*sat 6

也许这个变体比explode()慢一点,但是只需要一个字符串:

$name = preg_replace('/@.*?$/', '', $email);
Run Code Online (Sandbox Code Playgroud)