将字符串的一部分与其他字符串的一部分匹配

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),这将显着限制潜在匹配。但即便如此......匹配frurui是否有意义?

更好的方法是使用字典,从搜索字符串中提取实际的单词或音节。 (在您的情况下,从 fruitbag 中提取 fruitbag)。

你可以找一本英语词典fairly easily