Php 用户代理头-mysql存储的缩写

Php 用户代理头-mysql存储的缩写,php,mysql,types,user-agent,Php,Mysql,Types,User Agent,根据这条线索,特别是这篇文章:,微软总是炫耀自己。用户代理的大小可能非常非常巨大 我正在用php开发一个小的访问者库,我想存储用户代理信息。我无法决定数据类型和长度 所以我的问题是:关于如何将用户代理缩短到“正常”大小,你有什么想法吗?(例如256个字符) 注意:开发人员使用用户代理来检测用户浏览器和操作系统。所以根据链接的例子,所有M$的愚蠢数字都是。。。你就是。和往常一样,这让我们很紧张因此,我们的想法是创建一个函数,缩短用户代理字符串,但不会丢失重要信息。 我认为这一职能应: 不依赖于

根据这条线索,特别是这篇文章:,微软总是炫耀自己。用户代理的大小可能非常非常巨大

我正在用php开发一个小的访问者库,我想存储用户代理信息。我无法决定数据类型和长度

所以我的问题是:关于如何将用户代理缩短到“正常”大小,你有什么想法吗?(例如256个字符)


注意:开发人员使用用户代理来检测用户浏览器和操作系统。所以根据链接的例子,所有M$的愚蠢数字都是。。。你就是。和往常一样,这让我们很紧张因此,我们的想法是创建一个函数,缩短用户代理字符串,但不会丢失重要信息。

我认为这一职能应:

  • 不依赖于未来的更新和新浏览器(无硬编码字符串)
  • 有一个简单的机制来决定删除什么(例如,如果有一个数字,逗号,数字,逗号,数字,…,它可以删除它,这是不有趣的)
  • 最后,如果所有的操作仍然导致太长的用户代理(比如256个字符),那么就没有更多的事情要做了,所以只需中断其余的操作。这是百万分之一,因此数据可能会丢失

附加说明:我知道,我可以制作一个函数,从用户代理获取浏览器和操作系统类型,并只保存这些值。但是像往常一样,这样的函数有硬编码的名称,如果浏览器不被识别,它会返回“Unrecognized browser”(未识别的浏览器)。因此,将来每个人都必须记住更新这些函数。如果我们保存shorten user agent,信息不会丢失(因为只有读取数据库的脚本必须有新的识别系统).但数据库中的条目是可靠和一致的,这是应该的


更新: 由于应该有一些代码,idea存在问题,而不是现有代码的问题,因此我将编写一些到目前为止我编写的最低限度的代码;):


用户代理字符串没有规则,因此无法创建完全正确且经得起未来考验的解析器。不过有一种通用模式:

User-Agent: <engine-string> <engine-string> ...
每个引擎字符串(根据我的理解,我只是这样称呼它,这可能不正确)可能有注释,也可能没有注释

例如:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
(这是一个字符串,我只是把它分成几行。)看起来,每当有人做浏览器引擎的分支时,他们只是把他们的东西附加到末尾。所以我们有一些抽象的“Mozilla”浏览器(“第一次浏览器战”的遗留物),认为它在iPhone上。然后我们看到有一个WebKit(它还记得它很久以前就以KHTML的形式诞生了)。然后有一些版本/6.0的修改,然后被修改成Mobile/10A5376e,成为Safari/8536.25,这最终揭示了它实际上是一个移动谷歌机器人的秘密

另一个例子:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
这是一个单一的引擎,但在括号里有很多话要说

因此,一般的观察结果是:

  • 最后一个引擎字符串是最重要的
  • Parentese中的最后一条评论就不那么重要了
考虑到这一点,我的想法是将字符串解析为这些引擎和注释标记,然后从每个引擎部分扔掉从第五个开始的注释。然后,如果仍然不够,扔掉从第二个开始的引擎部分(第一个通常是抽象的“Mozilla”),但通常有有用的注释;有时它实际上是一些具体的东西,特别是对于网络爬虫)


解析时,我们需要考虑到有时可能会有不符合此格式的字符串。它们可以保存到日志文件中供以后检查,然后简单地剪切到所需的长度以适合数据库。

您可以使用
preg_replace()从中提取某些信息
并储存您所需的内容。非常感谢您的回答。这是唯一的答案,但我相信没有人会以更广泛的方式完成此主题。+1,已接受。向您致意,并衷心感谢您的工作和知识。谢谢!