将字符串的一部分与其他字符串的一部分匹配
Match part of string with part of other string
我正在开发一个简单的搜索功能,我想将一个字符串的一部分与另一个字符串的一部分相匹配。
示例:
搜索词是:fruitbag
我要搭配的商品:fruit applebag
我想创建一些东西以便系统匹配:
- 水果袋子
- 水果苹果包
甚至 "fruit" 和 "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"
}
使用类似这样的方法(将搜索到的单词分成两部分,并寻找在这两部分之间具有字符的匹配项):
$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 )
这是可能的,但可能会非常昂贵。如前所述,您的要求是搜索词的任何子字符串都可能相关。所以取 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
是否有意义?
更好的方法是使用字典,从搜索字符串中提取实际的单词或音节。 (在您的情况下,从 fruitbag
中提取 fruit
和 bag
)。
你可以找一本英语词典fairly easily。
我正在开发一个简单的搜索功能,我想将一个字符串的一部分与另一个字符串的一部分相匹配。
示例: 搜索词是:fruitbag 我要搭配的商品:fruit applebag
我想创建一些东西以便系统匹配:
- 水果袋子
- 水果苹果包
甚至 "fruit" 和 "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"
}
使用类似这样的方法(将搜索到的单词分成两部分,并寻找在这两部分之间具有字符的匹配项):
$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 )
这是可能的,但可能会非常昂贵。如前所述,您的要求是搜索词的任何子字符串都可能相关。所以取 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
是否有意义?
更好的方法是使用字典,从搜索字符串中提取实际的单词或音节。 (在您的情况下,从 fruitbag
中提取 fruit
和 bag
)。
你可以找一本英语词典fairly easily。