将文本中的任何术语匹配到可用的术语列表

时间:2018-10-28 08:53:19

标签: php arrays substring string-matching

我有一系列术语:

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

我想根据特定的句子来过滤此数组,例如:

zebra is white and black, and lion is fast

我尝试使用strpos和一些正则表达式函数,但是没有得到预期的结果。我期望的是在列表中获得minimum项与句子“ ORDER”部分匹配的项,即:

[
  'white and black',
  'zebra',
  'lion is fast'
]

这样,我可以将结果与句子中的各个部分相匹配,如下所示:

\zebra\ is \white and black\, and \lion is fast\

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

能不能请我引导正确的方法?

1 个答案:

答案 0 :(得分:1)

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

在代码末尾,您将获得匹配项的数组。

$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"
}

https://3v4l.org/7iTHC