
PHP 原生 str_contains() 仅支持单个子串匹配,但可通过自定义函数轻松扩展为多关键词(数组)任意匹配,实现简洁、可复用的“多针查找”逻辑。
php 原生 `str_contains()` 仅支持单个子串匹配,但可通过自定义函数轻松扩展为多关键词(数组)任意匹配,实现简洁、可复用的“多针查找”逻辑。
在实际开发中,我们常需判断一个目标字符串($haystack)是否至少包含给定关键词列表($needles)中的某一个——例如验证用户输入是否含敏感词、检测日志中是否存在任一错误标识符,或实现简易的多条件内容过滤。虽然 PHP 8.0+ 引入了 str_contains() 提升单关键词判别体验,但它不支持数组形式的多关键词批量检查。
此时,推荐封装一个轻量、语义清晰的辅助函数 str_contains_any()(建议采用更具可读性的命名,优于原文的 str_containsa):
function str_contains_any(string $haystack, array $needles): bool
{
foreach ($needles as $needle) {
if (str_contains($haystack, $needle)) {
return true;
}
}
return false;
}
✅ 使用示例:
$text = 'The quick brown fox jumped over the lazy dog'; var_dump(str_contains_any($text, ['fox', 'cow', 'goat'])); // bool(true) var_dump(str_contains_any($text, ['cat', 'elephant'])); // bool(false)
⚠️ 注意事项:
- 所有 $needles 元素必须为字符串;若存在非字符串值(如 null 或数字),str_contains() 将抛出 TypeError,建议调用前统一类型校验或使用 (string) 强转;
- 该函数采用「短路匹配」策略:一旦发现首个命中项即返回 true,无需遍历全部关键词,性能友好;
- 如需全部关键词都存在(逻辑与),应改用 array_reduce($needles, fn($carry, $n) => $carry && str_contains($haystack, $n), true),而非本函数;
- 若关键词数量极大或匹配频率极高,可考虑预编译正则(如 preg_match('/fox|cow|goat/', $haystack)),但需权衡可读性与安全(注意转义用户输入)。
总结:无须依赖第三方库,几行代码即可补全 PHP 字符串匹配的能力缺口。保持函数纯、小、专,是构建健壮业务逻辑的基础。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











