php 8.0 中 strstr() 的第三个参数 $before_needle 设为 true 可返回匹配前部分,如 strstr("user@example.com", "@", true) 返回 "user",语义清晰、安全高效。

在 PHP 8.0 中,strstr() 默认返回的是**从第一次匹配位置开始到字符串末尾的子串**(即“后面部分”)。如果你想要的是**匹配位置之前的部分**(即“前面的部分”),不能直接用 strstr(),而应使用它的变体函数:stristr() 的反向兄弟 —— strtok() 不合适,真正该用的是 strstr() 的第三个参数 $before_needle。
✅ PHP 8.0+ 正确做法:用 strstr() 的第三个参数
PHP 7.3+ 引入了 strstr() 的可选第三个参数 $before_needle(布尔值),设为 true 即可返回匹配位置之前的部分:
-
strstr($haystack, $needle, true)→ 返回首次出现$needle之前的内容(不含$needle) - 如果未找到
$needle,返回false(注意类型判断) - 区分大小写(如需不区分,用
stristr($haystack, $needle, true))
示例:
$text = "user@example.com"; $local = strstr($text, "@", true); // 返回 "user" $domain = strstr($text, "@"); // 返回 "@example.com"
⚠️ 常见误区:别用 substr() + strpos() 手动截取(除非兼容老版本)
虽然可行,但冗余且易出错(比如 strpos() 返回 false 时直接传给 substr() 会截取整个字符串):
- 错误写法:
substr($text, 0, strpos($text, "@"))—— 未检查strpos是否失败 - 安全写法(不推荐,仅作兼容备选):
$pos = strpos($text, "@"); $local = ($pos !== false) ? substr($text, 0, $pos) : null;
? 补充:和 explode() 的区别
explode("@", $text)[0] 看似简洁,但有隐患:
- 如果
$text不含 "@",结果是原字符串(不是false,不易察觉错误) - 如果 "@" 出现多次,只取第一个分段 —— 行为看似一致,但语义不明确、性能略低(创建数组)
- 不建议用于此目的,尤其在需要严格判断存在性的场景
? 小结:优先用 strstr(..., true)
这是 PHP 8.0 官方支持、语义清晰、性能好、安全性高的标准解法。只要确保 PHP ≥ 7.3(8.0 完全满足),就无需绕路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











