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项,我担心现在的性能。