用 strstr() 提取邮箱 @ 前部分不合适,因其返回含 @ 的后半段;正确方法是 strpos() + substr() 定位截取,或 explode('@', $email, 2) 取首段,配合空合并运算符安全处理,并建议先用 filter_var($email, filter_validate_email) 校验格式。

用 strstr() 提取邮箱中 @ 前面的部分不合适,它返回的是 从第一次出现位置开始的后半部分(含 @),不是前半部分。
正确方法:用 strpos() + substr()
先定位 @ 的位置,再截取开头到该位置前的字符串:
$email = 'user@example.com'; $atPos = strpos($email, '@'); $username = ($atPos !== false) ? substr($email, 0, $atPos) : ''; echo $username; // 输出:user
-
strpos()返回@的索引(从 0 开始),没找到返回false -
substr($email, 0, $atPos)表示从第 0 位起,取$atPos个字符(不包含@) - 务必判断
$atPos !== false,避免对false调用substr导致警告
更简洁:用 explode()
按 @ 拆分,取第一段:
$email = 'test@domain.co.uk';
$parts = explode('@', $email, 2); // 限制最多拆成 2 段,提升效率
$username = $parts[0] ?? ''; // PHP7.4 支持空合并运算符
echo $username; // 输出:test
-
explode('@', $email, 2)只拆一次,防止域名里有@(虽然合法邮箱域名不含 @,但健壮性更好) -
?? ''安全处理数组越界(如邮箱不含 @ 时$parts[0]不存在)
注意:别误用 strstr()
下面写法是错的:
// ❌ 错误示范:返回的是 '@example.com',不是 'user' $username = strstr($email, '@'); // ✅ 如果非要用 strstr,得配合 strrev 和 substr(绕弯且低效) $reversed = strrev($email); $reversedAt = strstr($reversed, '@'); $username = strrev(substr($reversedAt, 1)); // 不推荐
-
strstr($email, '@')找到@并返回包括它在内的后面全部内容 - 强行反转再截取逻辑复杂、可读性差、性能低,纯属炫技,不建议
补充:验证邮箱格式再提取更稳妥
实际项目中建议先简单校验是否为邮箱格式,再提取用户名:
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$atPos = strpos($email, '@');
$username = $atPos !== false ? substr($email, 0, $atPos) : '';
} else {
$username = '';
}
-
filter_var(..., FILTER_VALIDATE_EMAIL)能过滤掉明显非法格式(如缺少 @、双 @、结尾无域名等) - 避免对脏数据做字符串操作,减少意外错误
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











