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

时间:2015-06-16 07:41:06

标签: php regex string preg-match

我正在处理一个简单的搜索功能,我希望将字符串的一部分与另一个字符串的一部分相匹配。

实施例: 搜索字词是:fruitbag 我想匹配产品:水果applebag

我想创建一些东西,以便系统匹配:

  • 水果
  • 水果 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"
    }

2 个答案:

答案 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),这将显着限制潜在的匹配。但即便如此......匹配frurui

是否合理

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

您可以找到英文词典fairly easily