Php 将文本中的任何术语与现成的术语列表相匹配

Php 将文本中的任何术语与现成的术语列表相匹配,php,arrays,substring,string-matching,Php,Arrays,Substring,String Matching,我有一系列术语: $arr = [ 'black', 'white and black', 'lion', 'fast', 'zebra', 'lion is fast', 'zebra is white' ]; 我想根据特定的句子过滤此数组,例如: 斑马是黑白相间的,狮子跑得很快 我尝试使用strpos和一些正则表达式函数,但没有得到预期的结果。我所期望的是得到列表中符合句子部分顺序的最小项目数量,即: [ 'white and black', 'zebr

我有一系列术语:

$arr = [
  'black',
  'white and black',
  'lion',
  'fast',
  'zebra',
  'lion is fast',
  'zebra is white'
];
我想根据特定的句子过滤此数组,例如:

斑马是黑白相间的,狮子跑得很快

我尝试使用strpos和一些正则表达式函数,但没有得到预期的结果。我所期望的是得到列表中符合句子部分顺序的
最小
项目数量,即:

[
  'white and black',
  'zebra',
  'lion is fast'
]
这样,我就可以将结果与句子中的各个部分分开,如下所示:

\zebra\是\黑白\,而\ lion是快速\

忽略数组中的其他项,因为它们不完全匹配


您能告诉我正确的方法吗?

将数组按长度排序并循环。
在字符串中找到数组项后,将其保存到新数组中,并从字符串中删除子字符串

在代码的末尾,您将得到一个匹配项的数组

$arr = ['black',
'white and black',
'lion',
'fast',
'zebra',
'lion is fast',
'zebra is white'];

$str = "zebra is white and black, and lion is fast";

function sortl($a,$b){
    return strlen($b)-strlen($a);
}

usort($arr,'sortl');

foreach($arr as $s){
    if(strpos($str, $s) !== false){
        $new[] = $s;
        $str = str_replace($s, "", $str);
    }
}

var_dump($new);
输出:

array(3) {
  [0]=>
  string(15) "white and black"
  [1]=>
  string(12) "lion is fast"
  [2]=>
  string(5) "zebra"
}

请编辑问题以添加您已经尝试过的代码片段。这是一个循环,通过数组项,并尝试在句子中“strpos”它们,很明显列表中的一些其他项是匹配的,如
黑色
狮子
。。。不管怎样,我都会发布它。预期的输出是什么?你有两个带有
lion
的项目,它们都应该在输出中吗?在我的问题
中,我的预期输出旁边只有箭头,这非常聪明,谢谢,在我的另一个问题中,有没有办法用mySQL实现这一点?你介意看一下吗:@tinyCoder我在MySQL中没有这方面的技能。Andreas非常感谢你,我最后可以问一下术语数组是否是2D的,并且每个术语都有一个ID,比如
[{ID:12323,term:'white and black'},{}…]
上面的代码是什么样子的?ID是唯一的吗?如果是,那么我将使用array_列使数组平坦<代码>$arr=array_列($arr,“term”,“id”)这使得键id和值成为术语。不,它不是唯一的。不幸的是,这就是为什么我在我的评论中没有将其作为键=>value编写,多个术语可能具有相同的id。如果列表中的项超过1000项,我担心现在的性能。