在PHP开发中,判断一个字符串是否包含另一个子串是常见需求。PHP提供了多种函数实现这一功能,但它们的性能、大小写敏感性以及对中文的支持各不相同。本文总结并对比这些方法,帮助你在实际项目中做出正确选择。
1. strstr()
strstr() 函数用于搜索一个字符串在另一个字符串中的首次出现,并返回从匹配点开始的剩余部分。如果未找到,则返回 false。$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain; // 输出 @example.com
该方法适用于需要获取匹配后子串的场景,若只需要判断是否包含,还需额外检查返回值是否为 false。
2. stristr()
stristr() 与 strstr() 用法完全相同,唯一区别是 stristr() 不区分大小写。当需要忽略大小写进行匹配时,stristr() 是直接选择。
3. strpos()
strpos() 返回子串首次出现的位置(从0开始)。若未找到则返回 false。注意必须使用严格比较运算符 === 来检测 false,因为子串出现在位置0时,返回0在宽松比较中会被视为 false。$str = 'www.jb51.net';
if (strpos($str, 'jb51') !== false) {
echo '包含jb51';
} else {
echo '不包含jb51';
}
strpos() 执行速度通常比 strstr() 和 stristr() 更快,因为它只返回位置而非子串。然而,它对中文支持不佳,因为中文字符在UTF-8编码下占用多个字节,strpos() 按字节处理,可能得到错误的位置。
4. explode()
explode() 按指定分隔符拆分字符串,若拆分后数组元素个数大于1,则说明原字符串包含该分隔符。function check_str($str) {
$needle = 'a';
$tmparray = explode($needle, $str);
return count($tmparray) > 1;
}
这种方法效率较低,因为 explode() 需要生成一个数组,仅在特殊场景下(如需要获取分割后的各部分)才推荐使用。
5. substr()
当需要判断字符串末尾或特定位置是否包含某个子串时,可用 substr() 截取对比。$str = "<p>some text .dll</p>";
if (substr($str, -8) == ".dll</p>") {
echo substr($str, 0, -4);
}
这种方法适合固定位置的匹配,不适用于通用包含检测。
6. substr_count()
substr_count() 返回子串在原字符串中出现的次数。利用该次数可判断是否包含。function check_str($str, $substr) {
$nums = substr_count($str, $substr);
return $nums >= 1;
}
注意:substr_count() 也是按字节计算,对中文可能不准确。但它不返回位置,只统计次数,适合需要统计出现频率的场景。
总结:
- 性能优先且不涉及中文:推荐 strpos(),配合 === false 判断。
- 需要获取匹配后的子串:推荐 strstr() 或 stristr()(忽略大小写)。
- 处理多字节编码(如UTF-8中文):上述函数均不理想,建议使用 mb_strpos() 或 mb_substr_count()(原文未提及,此处仅提醒)。
- 不需要精确判断仅需检测包含:substr_count() 也可用,但开销略高。
- 避免滥用 explode() 和 substr() 做通用包含检测。
根据实际需求选择合适的方法,既能提升代码可读性,也能保证执行效率。 |