【问题标题】:get user name from an E-mail address in php从 php 中的电子邮件地址获取用户名
【发布时间】:2013-08-16 15:42:53
【问题描述】:

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

$string = "user@domain.com";

如何仅从电子邮件地址获取“用户”?有什么简单的方法可以获取@之前的值吗?

【问题讨论】:

  • 警告:电子邮件地址可能包含多个“@”...!
  • 您可以使用 strstr() 函数查看此示例:php.net/manual/en/function.strstr.php#example-4852
  • $email = "yourremail@somedomain.com"; $domain_name = substr(strrchr($email, "@"), 1); echo "域名是:" . $domain_name;
  • @John - 仅供参考,在我的“现实生活场景”中,我有两个电子邮件地址,其中有两个我每天使用的“@”——事实上,它们是我的主要电子邮件。我已经使用它们至少 20 年了。猜猜我从来没有登录过你处理电子邮件的任何地方——但它们确实存在并且很常见!
  • @CFPSupport 这么说吧:您可以轻松地在您可以想到的任何工具、购物车、网站中禁止任何此类电子邮件地址,并且此决定的经济影响低于显着幅度。这就像排除 Windows 3.11 支持

标签: php string email


【解决方案1】:

假设电子邮件地址有效,这种文本方法应该可以工作:

$prefix = substr($email, 0, strrpos($email, '@'));

它需要直到最后一次出现(但不包括)@。它使用最后一次出现,因为此电子邮件地址有效:

"foo\@bar"@iana.org

如果您还没有验证字符串,我建议您使用过滤功能:

if (($email = filter_var($email, FILTER_VALIDATE_EMAIL)) !== false) {
    // okay, should be valid now
}

【讨论】:

  • @jpro 我认为问题标题是错误的 :)
【解决方案2】:

尝试以下方法:

$string = "user@domain.com";

$explode = explode("@",$string);

array_pop($explode);

$newstring = join('@', $explode);

echo $newstring;

针对多个“@”符号进行了修改。

【讨论】:

  • 这不符合 RFC,如果地址包含多个“@”,可能会失败!是的,这是可能的(虽然在实践中遇到的不多)!
  • 对于地址 "Abc\@def"@iana.org 任何其他地址,这将失败。
  • str_getcsv() 带有@ 分隔符,但允许邮箱引用可能是另一种解决方案$explode = str_getcsv($string, '@','"');
  • 针对多个 @ 符号进行了编辑,尽管这可能不是最好的方法。
  • 可能会使用 array_pop 删除数组的最后一个元素,然后使用 @ 将数组内爆以将其返回为字符串。可能有助于处理带有多个 @ 符号的地址。
【解决方案3】:

你可以使用

$user = implode('@', explode('@', $email, -1));

$user = substr($email, 0, strrpos($mail, '@'));

【讨论】:

    【解决方案4】:

    strpos() 函数的 PHP 手册条目中有一个很好的示例:http://php.net/manual/en/function.strstr.php#117530

    PHP 让这一切变得简单。处理电子邮件地址的域部分时,只需将 strstr() 的返回值传递给 substr() 并从 1 开始:

    substr(strstr($haystack, '@'), 1);

    【讨论】:

    • 这实际上是一个仅链接的答案。如果该链接失效,那么这个答案对研究人员来说就没有什么价值了。
    • 这个返回的是域名而不是用户,就像用户请求的那样
    • 如果地址包含多个@,这将不起作用。
    【解决方案5】:

    以最简单的形式(假设单个'@'),您可以按照@Ben Fortune 的回答(使用explode())。

    否则,试试这个:

    $email1 = "foo@example.com";
    $email2 = "b\@r@example.com";
    
    preg_match_all ("/^(.+)@[^@]+$/", $email1, $e1);
    preg_match_all ("/^(.+)@[^@]+$/", $email2, $e2);
    
    echo "Emails: {$e1[1][0]} and {$e2[1][0]}\n";
    // Result: Emails: foo and b\@r
    

    【讨论】:

    • 这也适用于多个@,只是正则表达式在这里不是正确的工具:)
    • 是的,正则表达式在这里可能有点矫枉过正。你的答案更简单。我不记得函数strrpos() 存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2015-01-23
    • 2013-09-29
    • 2023-01-25
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多