
在php开发中,我们经常会遇到这样的需求:给定一个目标字符串和两个或更多个包含关键词的数组,需要判断该字符串是否同时包含了每个数组中的至少一个关键词。例如,判断一个句子是否既提到了某个时间(如“morning”),又提到了某个人名(如“robert”)。这个看似简单的任务,在实现时却可能因为对php函数的不当使用而引入错误。
许多初学者可能会尝试直接将数组作为 strstr() 函数的第二个参数来查找字符串。例如:
<?php
$array1 = array('night', 'morning', 'afternoon');
$array2 = array('robert','david','justin');
$string ='robert read a book this morning';
// 错误尝试
if (strstr($string, $array1) && strstr($string, $array2)){
echo "Match found";
} else {
echo "Not found";
}
?>问题分析:strstr() 函数的第二个参数 needle 期望一个字符串。当传递一个数组时,PHP会尝试将其转换为字符串。在大多数情况下,一个数组被转换为字符串会得到 "Array",这显然不是我们想要匹配的关键词。因此,这种方法无法达到预期效果。
当我们需要匹配字符串中的完整单词时,array_intersect() 函数是一个非常高效且简洁的选择。
原理:
立即学习“PHP免费学习笔记(深入)”;
实现步骤:
示例代码:
<?php
$array1 = ['night', 'morning', 'afternoon'];
$array2 = ['robert','david','justin'];
$string ='robert read a book this morning';
// 将字符串拆分为单词数组
$stringWords = explode(' ', $string);
// 检查 stringWords 与 array1 的交集
$matchesArray1 = array_intersect($stringWords, $array1);
// 检查 stringWords 与 array2 的交集
$matchesArray2 = array_intersect($stringWords, $array2);
// 判断两个交集是否都非空
if (!empty($matchesArray1) && !empty($matchesArray2)) {
echo 'Match found';
} else {
echo 'Not Found';
}
// 另一个例子:不匹配的情况
$string2 = 'david read a book this evening';
$stringWords2 = explode(' ', $string2);
$matchesArray1_2 = array_intersect($stringWords2, $array1); // evening 不在 array1
$matchesArray2_2 = array_intersect($stringWords2, $array2); // david 在 array2
if (!empty($matchesArray1_2) && !empty($matchesArray2_2)) {
echo "\nMatch found for string2";
} else {
echo "\nNot Found for string2"; // 输出此行
}
?>适用场景: 此方法适用于需要精确匹配字符串中完整单词的情况。例如,如果 $array1 中有 "morning",而字符串中是 "goodmorning",explode 方法将无法匹配。
如果需求是匹配关键词作为字符串的任意子串(不一定是完整单词),或者关键词本身可能包含空格,那么迭代检查每个关键词是更灵活的方法。
原理:
立即学习“PHP免费学习笔记(深入)”;
实现步骤:
示例代码:
<?php
$array1 = ['night', 'morning', 'afternoon'];
$array2 = ['robert','david','justin'];
$string ='robert read a book this morning'; // 匹配
$string_substring = 'goodmorning robert'; // 匹配 (morning是子串)
$string_no_match = 'david read a book this evening'; // 不匹配
// 检查 array1
$foundInArray1 = false;
foreach ($array1 as $value) {
if (str_contains($string, $value)) { // PHP 8+
// if (strpos($string, $value) !== false) { // 兼容 PHP 5.x/7.x
$foundInArray1 = true;
break; // 找到一个匹配即可
}
}
// 检查 array2
$foundInArray2 = false;
foreach ($array2 as $value) {
if (str_contains($string, $value)) { // PHP 8+
// if (strpos($string, $value) !== false) { // 兼容 PHP 5.x/7.x
$foundInArray2 = true;
break; // 找到一个匹配即可
}
}
// 判断两个条件是否都满足
if ($foundInArray1 && $foundInArray2) {
echo "Match found for original string\n";
} else {
echo "Not Found for original string\n";
}
// 示例:使用 str_contains 匹配子串
$foundInArray1_sub = false;
foreach ($array1 as $value) {
if (str_contains($string_substring, $value)) {
$foundInArray1_sub = true;
break;
}
}
$foundInArray2_sub = false;
foreach ($array2 as $value) {
if (str_contains($string_substring, $value)) {
$foundInArray2_sub = true;
break;
}
}
if ($foundInArray1_sub && $foundInArray2_sub) {
echo "Match found for substring string\n"; // 输出此行
} else {
echo "Not Found for substring string\n";
}
?>str_contains() 与 strpos() 的选择:
适用场景: 此方法适用于需要匹配字符串中任意子串的情况,即使关键词不是独立单词。它提供了更高的灵活性。
整词匹配 (array_intersect):
子串匹配 (str_contains / strpos 循环):
通过理解这些方法及其适用场景,你可以根据具体需求选择最有效和最易维护的PHP代码来解决字符串与多数组值匹配的问题。
以上就是PHP中检测字符串是否同时包含两个数组中的任意值的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号