将字符串与可能类似字符串数组匹配的最佳方法是什么?

时间:2016-01-14 11:53:55

标签: php string-matching strpos

每天我都会从不同的公司获得几个包含产品信息的excel文件,并且通过产品名称将产品与我自己的数据库匹配的唯一方法。这些公司没有组织,产品名称是手工输入的,可能会在同一个excel文件中有所不同。

找到与我自己的产品列表最匹配的最佳方法是什么?有时公司A可能会称之为“玩具车”和“玩具车100”。在我不关心它是哪个号码的地方,我只是称之为“玩具车”#34;。然而,有时他们可能会称之为不同的东西,例如"提供玩具作为汽车"然后我需要将它与我的玩具车相匹配"产品

进行字符串匹配的最佳方法是什么,基本上我想匹配最相似的字符串。

我当前的实现涉及编写许多这样的if语句,当变体无法正确匹配时创建新的if语句。

foreach ($prodset as $p) {
    if (strpos(strtolower($dd['offer_name']), strtolower($p['prod_info'])) !== false && $p['active'] == 1) {
        $dd['product_id'] = $p['prod_id'];
        $result = $dd;
        return $result;
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用similar_text函数来计算两个字符串之间的相似度。

<?php

$base = 'Toy car';

$variations = array(
    'Provision for toy that is a car',
    'Toy that looks like a car',
    'Toy Car',
    'Toy CAR'
);

foreach($variations as $variation) {
    echo "{$base} and {$variation} = " . similar_text($base, $variation);
}

因此它会以区分大小写的方式匹配字符,您可以strtolower两个字符串以获得更好的结果。

请注意,复杂度为O(N**3),其中N是最长字符串的长度。

答案 1 :(得分:0)

也可以使用strpos(),你只需要添加额外的条件你要检查多少个单词。逻辑是这样的,

$str = "Toy car";
$splits = split(" ",$str);

if ( strpos($splits[0]) !== false && strpos($splits[1]) !== false ){
  echo "found";
}