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删除了他的答案,因为我觉得它比我的好.我要在这里发布(除非他取消回答):
为什么使用正则表达式而不是字符串函数?
Run Code Online (Sandbox Code Playgroud)$parts = explode("@", "johndoe@domain.com"); $username = $parts[0];
在这种情况下你根本不需要正则表达式.我认为个人使用explode是一个更好的选择.
正如JohannesRössel在评论中指出的那样,电子邮件地址解析相当复杂.如果你想100%确定你能够处理任何技术上有效的电子邮件地址,你将不得不编写一个能够正确处理报价的例程,因为我的答案中列出的两个解决方案都会窒息地址如"a@b"@example.com.可能有一个库为您处理这种解析,但我不知道它.
@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)
也许这个变体比explode()慢一点,但是只需要一个字符串:
$name = preg_replace('/@.*?$/', '', $email);
Run Code Online (Sandbox Code Playgroud)