我们会在我们的网站上跟踪用户代理字符串。我想对它们做一些统计,看看我们有多少IE6用户(所以我们知道我们要开发什么),以及我们有多少移动用户。
所以我们有这样的日志:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)
理想情况下,看到所有“有意义”的字符串会非常简洁,这可能意味着字符串长度超过一定长度。例如,我可能希望查看其中有多少条目FunWebProducts
,或.NET CLR
或.NET CLR 1.0.3705
- 但我不想要查看有多少人有分号。所以我不一定要寻找独特的字符串,而是所有的字符串,甚至是子集。所以,我希望看到所有Mozilla
的计数,知道这包括Mozilla/5.0
和Mozilla/4.0
的计数。如果有一个嵌套的显示器,从最短的字符串开始,并向下工作,那将是很好的。或许像
4,2093 Mozilla
1,093 Mozilla/5.0
468 Mozilla/5.0 (Windows;
47 Mozilla/5.0 (Windows; U
2,398 Mozilla/4.0
这听起来像是计算机科学的功课。这叫什么?这样的事情是存在的,还是我自己写的?
答案 0 :(得分:1)
您正在查看longest common substring问题,或者,鉴于您上面的具体示例,问题是最长的常见前缀问题,可以使用trie来解决。
但是,从上面的例子开始,你可能甚至不需要对此有效。相反,只需:
对某些标点子集上的字符串进行标记,例如[ ;/]
保存多个令牌的每个唯一前缀,替换原始分隔符
对于每个前缀,获取与其匹配的记录的计数并保存
答案 1 :(得分:0)
如果将其分解为主要名称(开头部分之前的部分),然后将分号分隔的每个部分存储为子记录,则可以进行任何所需的分析。例如,将其存储在关系数据库中:
BrowserID BrowserText
--------- -----------
1 Mozilla/4.0
2 Mozilla/5.0
FeatureID FeatureText
--------- -----------
1 compatible
2 MSIE 7.0
3 Windows NT 5.1
4 FunWebProducts
5 .NET CLR 1.0.3705
6 .NET CLR 1.1.4322
7 Media Center PC 4.0
8 .NET CLR 2.0.50727
然后记录对浏览器和部件的引用,您可以进行任何类型的分析。
答案 2 :(得分:0)
使用正则表达式将用户代理字符串解析为其相关组件部分怎么样?用户代理字符串的基本规范是' [name]
/ [version]
'或' [name]
[version]
'。根据该信息,我们可以使用([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+))
这样的正则表达式来获取匹配集,其中集合中的第一个匹配项是[name]
,而集合中的第二个匹配项是[version]
。当然,你必须从集合中的第二个匹配中去除空格和/
,或者修改正则表达式以使用lookbehind(几个正则表达式不支持,所以我没有#&# 39;在这里包括它。)
获得所有这些元组后,您可以根据需要操作和计算它们。