扩展的 'Contains' 函数 - PHP 字符串 Space - 带有多个逗号分隔的关键字针的分隔查询

Expanded 'Contains' Function - PHP String Space-Delimited Query with Multiple Comma-Separated Keyword Needle

我正在开发一个搜索/广告系统,可以将给定的广告组与关键字相匹配。查询是作为搜索字符串的字符串,我们正在寻找的是增强下面搜索查询的简单 'contains' 脚本的最佳和最有效的方法,但在 AND (&& )爆炸。使用此脚本,可以构建 'IF' 也可以是 "CASE" 下面是伪代码:

$query = "apple berry tomato potato":

if contains ($query,"tomato")  {   }
if contains ($query,"potato,berry")  {   }
if contains ($query,"apple,berry")  {  }

else i.e. none of the above do {  }

contains 函数会使用 strpos,但也会使用 explode 的某种组合来区分以逗号分隔的单词。所以 Apple,berry 将是一个字符串,其中包含以逗号分隔的关键字列表。

编写包含脚本以搜索查询字符串并匹配第二个参数中以逗号分隔的值的最佳方法是什么?喜欢你的想法。谢谢。

这是一个经典的简单 'contains' 函数,但它不处理逗号分隔的 AND 分解 - 它只适用于单个单词或短语

function contains($haystack,$needle)
{
    return strpos($haystack, $needle) !== false;
}

注意:增强的 contains 函数应该在 AND 的基础上扫描字符串的匹配项。如果 $needle 中存在逗号,则它需要包含所有关键字以显示匹配项。这个 post Check if String contains a given word 解释了简单的包含脚本。我正在寻找的是一个同名的扩展函数,它还可以搜索多个关键字,而不仅仅是一个单词。

$query 字符串将始终以 space 分隔。 $needle 字符串将始终以逗号分隔,或者可以用 spaces 分隔。

主要是功能多方向作用

假设 $query = 'business plan template' 或 $query = 'templates for business plan'

如果您 运行 包含 ($query,"business plan") 或包含 ($query,"business,plan") 两个测试都将显示匹配项。单词的顺序应该无关紧要。

这是一个简单的方法。只需使用 array_intersect():

$needle 的计数与 $haystack 中的 $needle(s) 的计数进行比较
function contains($haystack, $needle) {
    $h = explode(' ', $haystack);
    $n = explode(',', $needle);
    return count(array_intersect($h, $n)) == count($n);
}

您可以选择将 $needle 作为数组传入,然后就不需要 explode()

如果需要不区分大小写:

$h = explode(' ', strtolower($haystack));
$n = explode(',', strtolower($needle));