
PHP 的 str_contains() 不支持同时匹配多个关键词,但可通过自定义函数实现“任一匹配”逻辑,即只要字符串包含数组中任意一个关键词即返回 true。
php 的 `str_contains()` 不支持同时匹配多个关键词,但可通过自定义函数实现“任一匹配”逻辑,即只要字符串包含数组中任意一个关键词即返回 true。
在实际开发中,我们常需判断一段文本(如日志、用户输入或 HTML 内容)是否包含若干关键词中的任意一个——例如检测敏感词、特征标识或业务标签。虽然 PHP 8.0+ 引入了原生的 str_contains(),但它仅接受单个子字符串作为 $needle,无法直接处理关键词数组。
为此,可封装一个简洁、类型安全的辅助函数 str_contains_any()(推荐比 str_containsa 更具语义性):
function str_contains_any(string $haystack, array $needles): bool
{
foreach ($needles as $needle) {
if (!is_string($needle)) {
throw new InvalidArgumentException('All needles must be strings.');
}
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) var_dump(str_contains_any($text, [])); // bool(false)
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 该函数采用“短路求值”(short-circuit evaluation):一旦找到首个匹配项即立即返回 true,无需遍历全部关键词,性能友好;
- 空关键词数组会安全返回 false,符合直觉;
- 函数显式声明参数类型与返回类型,兼容严格模式,并对非字符串关键词抛出异常,增强健壮性;
- 若需“全部匹配”(即字符串必须同时包含所有关键词),应改用 array_reduce($needles, fn($carry, $n) => $carry && str_contains($haystack, $n), true),但这是不同语义场景。
总结:虽无原生多关键词支持,但通过几行清晰、可复用的代码即可优雅扩展 str_contains 的能力,兼顾可读性、性能与类型安全。



















