PHP如何判断字符串是否同时包含两个数组中各自的至少一个元素
问题解答
原有写法是否正确
原有写法是错误的。strstr()函数的第二个参数仅支持传入字符串,你直接传入数组会触发PHP类型警告,同时函数返回NULL,判断条件永远不成立,完全无法得到预期结果。
正确实现方案
你需要分别校验两个数组中是否各有至少一个元素是目标字符串的子串,满足这个条件才算匹配成功。
写法1:通用遍历方案(兼容所有PHP版本,性能最优)
封装一个通用检测函数,遍历数组逐个校验是否存在匹配项:
<?php /** * 检测字符串是否包含数组中任意一个元素 * @param string $str 待检测的目标字符串 * @param array $arr 待匹配的关键词数组 * @return bool */ function hasAnyKeyword(string $str, array $arr): bool { foreach ($arr as $keyword) { // 用strpos判断子串存在,性能优于strstr if (strpos($str, $keyword) !== false) { return true; } } return false; } // 你的示例数据 $array1 = ['night', 'morning', 'afternoon']; $array2 = ['robert','david','justin']; $string = 'robert read a book this morning'; // 执行判断 if (hasAnyKeyword($string, $array1) && hasAnyKeyword($string, $array2)) { echo "Match found"; } else { echo "Not found"; }
写法2:正则简化方案(适合数组元素无特殊正则符号的场景)
如果数组里的元素都是普通文本,也可以用正则匹配简化代码,省去手动遍历:
<?php $array1 = ['night', 'morning', 'afternoon']; $array2 = ['robert','david','justin']; $string = 'robert read a book this morning'; // 转义特殊字符后拼接正则,末尾加i可实现不区分大小写匹配 $regex1 = '/' . implode('|', array_map('preg_quote', $array1)) . '/i'; $regex2 = '/' . implode('|', array_map('preg_quote', $array2)) . '/i'; if (preg_match($regex1, $string) && preg_match($regex2, $string)) { echo "Match found"; } else { echo "Not found"; }
内容的提问来源于stack exchange,提问作者Nesto91
相关产品推荐
相关产品推荐

