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

2022-08-30 14:40:13

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

johndoe@domain.com (John Doe)

我只需要得到@之前的部分,没有别的。文本来自一个简单的 XML 对象(如果这很重要)。

我的代码如下所示:

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

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

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


答案 1

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

([^@]+)

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


我不知道为什么本·詹姆斯删除了他的答案,因为我觉得它比我的好。我将在这里发布它(除非他取消删除他的答案):

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

$parts = explode("@", "johndoe@domain.com");
$username = $parts[0];

在这种情况下,您根本不需要正则表达式。就我个人而言,我认为使用是一个更好的选择。explode


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


答案 2

@OP,如果您只想获取 @ 之前的所有内容,只需使用字符串/数组方法即可。不需要复杂的正则表达式。在“@”上分解,然后删除最后一个元素,即域部分

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

输出

$ php test.php
"peter@john@doe"

推荐