- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据这个线程,特别是这个帖子:https://stackoverflow.com/a/6595973/1125465 ,微软一如既往地炫耀。用户代理的大小可能非常非常大。
我正在用 php 开发一个小型访客库,我想存储用户代理信息。我无法决定数据类型和长度。
所以我的问题是:关于如何将用户代理缩短到某个“正常”大小,您有什么想法吗? (例如 256 个字符)。
注意:开发人员使用用户代理来检测用户浏览器和操作系统。所以根据链接的例子,所有来自 M$ 的愚蠢数字都只是......只是。一如既往,让我们心烦意乱。 因此,我们的想法是制作一个缩短用户代理字符串但又不会丢失重要信息的函数。
我认为这样的功能应该:
附加说明:我知道,我可以创建一个函数,从用户代理获取浏览器和操作系统类型,并仅保存这些值。但是像往常一样,这样的函数有硬编码的名称,如果无法识别浏览器,它会返回“无法识别的浏览器”。所以将来每个人都必须记住更新这些函数。如果我们保存缩短用户代理,信息是丢失(因为只有读取数据库的脚本必须有新的识别系统)。但数据库中的条目是可靠和一致的,应该是。
更新:因为应该有一些代码,而且想法有问题,而不是现有代码的问题,所以我会写一些我到目前为止写的最少的代码;):
<?php
function shorten($useragent, $maxsize = 256) {
$shorten = $useragent;
... // ?
$shorten = substr($shorten, 0, $maxsize); // the "last hope" cut
return $shorten;
}
echo shorten($_SERVER['HTTP_USER_AGENT']);
?>
最佳答案
User-Agent 字符串没有规则,因此无法创建完全正确且面向 future 的解析器。不过有一个通用模式:
User-Agent: <engine-string> <engine-string> ...
engine-string
的形式:
<agent-name> (<comment>; <comment>; ...)
每个引擎字符串(我只是根据我的理解调用它,这可能不正确)可能有也可能没有评论。
例如:
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)
(这是一个单一的字符串,我只是把它分成几行。)似乎,每当有人对浏览器引擎进行 fork 时,他们只是将他们的东西附加到最后。所以我们有一些抽象的“Mozilla”浏览器(“第一次浏览器大战”的遗产)认为它在 iPhone 上。然后我们看到有一个 WebKit(它记得很久以前它是作为 KHTML 诞生的)。然后是Version/6.0的一些修改,然后修改成Mobile/10A5376e,变成Safari/8536.25,终于揭开了它其实是一个移动谷歌bot的 secret 。
另一个例子:
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”,但通常有有用的评论;有时它实际上是具体的东西,特别是对于网络爬虫)。
在解析时,我们需要考虑到偶尔可能会有不遵循这种格式的字符串。它们可以保存到日志文件中供以后检查,然后简单地剪切成所需的长度以适合数据库。
关于php - User agent header - mysql存储的缩写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742935/
我想看看我的表中使用了哪些月份。我可以获得 id 和名称(见下文)没问题,但我无法提取 abrv。我在使用 %b 之前已经完成了,但似乎无法在此处获得语法。我哪里错了? SELECT DIST
我记得 PaulP 展示了一个很酷的技巧来缩写重复的长 @specialized序列,但我找不到原来的帖子了。就像我有 trait Foo[@specialized(Int, Float, Doubl
此 C# 声明的等效 F# 声明是什么: 使用 NR = ICSharpCode.NRefactory; 最佳答案 F# 中的缩写可以应用于模块: module ES = Microsoft.FSha
我正在 emacs 中编辑 Mathematica 代码。 Mathematica 对希腊字母的明文表示看起来像 \[Alpha], \[Beta], \[Gamma], ... 我不介意输入这些,但
我从 GMT 偏移量(以秒为单位)开始,我想要相应时区的名称。我是说: let offset = -28800 let tz = TimeZone(secondsFromGMT: offset) le
我正在 emacs 中编辑 Mathematica 代码。 Mathematica 对希腊字母的明文表示看起来像 \[Alpha], \[Beta], \[Gamma], ... 我不介意输入这些,但
对于kubectl describe我可以简写几类资源,例如: po/xxx -> pods/xxx rs/xxx -> replicasets/xxx 我在哪里可以找到完整列表? 我正在尝试查找部署
当 id 是我们对目标的全部了解时,将 UUID 缩写为在用户界面中的按钮中使用的好方法是什么? GitHub 似乎通过从开头取 7 个字符来缩写提交 ID。例如 b1310ce6bc3cc932ce
这个 C/C++ 简化测试用例: int x = ~~~; const double s = 1.0 / x; const double r = 1.0 - x * s; assert(r >= 0)
如果我有一个具有许多共享相同属性约束的属性的类,如下所示: class myClass { String thisString String thatString String
我正在研究 Java Card (SIM),并且正在使用 OTA 技术。有些表达方式我还没有一个很好的定义。 例如,当我在 SIM(用户身份模块)上加载小程序时,我使用 BIP 或 SMS。我知道短信
这个问题与这个问题是同一个问题(但是对于log4j2): log4j: abbreviate/shorten package names 最佳答案 这非常简单,记录在 http://logging.a
这个 C/C++ 简化测试用例: int x = ~~~; const double s = 1.0 / x; const double r = 1.0 - x * s; assert(r >= 0)
我刚刚查看了下面列出的 gcc-arm-none-eabi 编译器二进制文件,但我真的不知道所有使用的缩写。我想知道哪个二进制文件是预处理器、链接器、编译器等等... $ ls /opt/gcc-ar
缩写 UBER 是什么意思?我知道 UBER 是 BouncyCaSTLe-Keystore 等,但我不知道缩写是什么意思。 谢谢 最佳答案 我认为这是对德语单词“Über”(over 或 super
代码应该打印用户的姓名缩写,但代码有一个错误,而是打印出整个名称,每个字母之间有空格。我知道错误存在于 for 循环中,但我不知道如何调试这个问题。建议? int main(void) { prin
当我尝试在 for 循环中使用“i < n”时,出现错误(准确地说是 4)。如果我把它拿出来,我就会陷入无限循环。我似乎也无法运行 if 语句。对我可以改进的地方有什么想法吗? int main()
有没有办法缩写以下内容? if ($chk == 1 || $chk == 3 || $chk == 5 || $chk == 7){ do some stuff } 谢谢。 最佳答案 if (in_
如何在使用 log4j 生成的日志中缩写/缩短包名称。即,我想要 c.l.a.l.MyClass 而不是 com.longpackage.anotherpackage.lastpackage.MyCl
我正在使用 ReSharper 并试图遵守它的默认规则。 在我的部分代码中,我需要将字符串属性更改为 PascalCase。 我尝试了多种方法,但找不到一种适用于所有大写缩写的方法。 前任: MPSU
我是一名优秀的程序员,十分优秀!