我正在处理一个简单的搜索功能,我希望将字符串的一部分与另一个字符串的一部分相匹配。
实施例: 搜索字词是:fruitbag 我想匹配产品:水果applebag
我想创建一些东西,以便系统匹配:
甚至"水果" &" bag"。
总结;字符串中的部分需要与搜索项内的部分匹配。这可能吗?
$products = array(
'fruit applebag',
'pinapple',
'carrots',
'bananas',
'coconut oil',
'cabbage',
);
if( ! empty( $_POST['search'] ) ) {
$s = $_POST['search'];
$results = array();
foreach( $products as $index => $product ) {
if( preg_match( '/' . $s . '.*/i', $product, $matched ) ) {
$results[] = $matched[0];
}
}
print_r($results);
// This only returns fruit applebag if the search term is something like "fruit ap"
}
答案 0 :(得分:1)
使用类似的东西(将搜索到的单词分成两部分,然后查找匹配,这两部分之间有字符):
$products = array(
'fruit applebag',
'pinapple',
'carrots',
'bananas',
'coconut oil',
'cabbage',
);
$s = 'fruitbag';
$results = array();
foreach( $products as $index => $product ) {
for($i=1;$i<strlen($s);$i++){
if(preg_match( '/' . substr($s,0,$i) . '.*'.substr($s,$i+1).'/i', $product, $matched ) ) {
$results[] = $matched[0];
}
}
}
print_r($results);
输出:
Array ( [0] => fruit applebag [1] => fruit applebag )
答案 1 :(得分:1)
这是可能的,但可能非常昂贵。如上所述,您的要求是搜索词的任何子字符串都可能具有相关性。所以取fruitbag
并生成所有子串的列表:
f,r,u,i,t,b,a,g,fr,ru,ui,it,tb,ba,ag,fru,rui,uit,...,bag,...,fruit,...,fruitbag
但是你可能不希望任何带有a
字母的单词匹配。因此,第一种方法可以是指定最小数量的字母(例如3),这将显着限制潜在的匹配。但即便如此......匹配fru
或rui
?
更好的方法是使用字典,从搜索字符串中提取实际的单词或音节。 (在您的情况下,从fruit
)中提取bag
和fruitbag
。
您可以找到英文词典fairly easily。