我正在根据用户代理返回手机数据。但是在没有存储useragent的情况下(更新版本的手机或软件),我希望能够返回最接近的匹配,有点像谷歌显示“你的意思是这个”。即。
如果我有
的存储用户Mozilla / 5.0(Linux; U; Android 2.1- UPDATE1; EN-NL; Desire_A8181 Build / ERE27)AppleWebKit / 530.17 (KHTML,像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,像Gecko一样)Version / 4.0 Mobile Safari浏览器/ 530.17
我希望能够返回存储的内容,以相应地添加或调整我的数据。
有谁知道实现这一目标的方法?
答案 0 :(得分:4)
使用大多数相关数据进行全文搜索......
SELECT * MATCH(browser) AGAINST ('your browser') AS score order by score DESC
答案 1 :(得分: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。刚刚添加了答案的完整性; - )
答案 2 :(得分:0)
查看Highlight the difference between two strings in PHP上的其中一个脚本,通过一些修改,您应该可以获得一定比例的差异。
答案 3 :(得分:0)
使用full-text search;否则这些功能可能有所帮助:
答案 4 :(得分:0)
为了获得最佳结果,您可以提取整个记录并循环猜测谁是最相似的单词
检查这些功能
即
$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"
无论如何,您可以按照this one
等指南使用mySQL全文搜索