6

我正在根据用户代理返回手机数据。但是在未存储用户代理的情况下(较新版本的手机或软件),我希望能够返回最接近的匹配,有点像谷歌如何显示“你是不是这个意思”。IE

如果我有一个存储的用户代理

Mozilla/5.0 (Linux; U; Android 2.1-update1; en-nl; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

并且正在使用的用户代理是

Mozilla/5.0 (Linux; U; Android 2.1-update1; en-nl; Desire_G45H Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

我希望能够返回存储的数据以相应地添加或调整我的数据。

有谁知道实现这一目标的方法?

4

5 回答 5

4

对最相​​关的数据使用全文搜索...

SELECT * MATCH(browser) AGAINST ('your browser') AS score order by score DESC
于 2011-07-08T09:24:48.433 回答
2

模糊字符串匹配的常用方法是计算 levenshtein 距离或将其实现为 n-gram 搜索索引。但是对于匹配的用户代理来说,这是矫枉过正的。

而是将您搜索的字符串减少到某些重要标准,然后执行类似的操作

SELECT * FROM agents WHERE agent LIKE "Mozilla/5.0 (Linux; U; Android%) AppleWebKit/5% Version/4.0 Mobile Safari/5%"

所以,你去掉某些过于详细的部分,并在你的 LIKE 语句中用 % 替换它们。但是,您应该重新考虑架构 - 我只会保存重要部分并省略确切的内部版本号等。还可以考虑使用已经包含用户代理并为您进行匹配的外部库,无需重新发明轮子。

编辑:正如 VolkerK 上面指出的那样,“外部库”应该是PHPs getbrowser。只是为了回答的完整性而添加的;-)

于 2011-07-08T09:23:29.917 回答
0

为了得到最好的结果,你可以提取整个记录并做一个循环来猜测谁是最相似的词

检查这些功能

SIMILAR_TEXT

声讯

莱文斯坦

IE

$most_similar = "";
$highestPercentage = 0;
foreach ($ua in $all_user_agents) {
    $i = similar_text($current_user_agent, $ua, &$p);
    if ($p > $highestPercentage) {
        $highestPercentage = $p;
        $most_similar = $ua;
    }
}

echo "most similar = $most_similar"

无论如何,您可以使用 mySQL Fulltext-search 遵循一些类似这样的准则

于 2011-07-08T09:29:55.977 回答
0

看一下突出 PHP 中两个字符串之间的差异的脚本之一,通过一些修改,您应该能够获得差异的百分比。

于 2011-07-08T09:21:27.190 回答
0

使用全文搜索;否则,这些功能可能会有所帮助:

于 2011-07-08T09:28:54.207 回答