【问题标题】:User Agent Pattern Matching in lualua中的用户代理模式匹配
【发布时间】:2017-07-13 22:44:30
【问题描述】:

我是 lua 脚本语言的新手,所以只是尝试使用这种语言。 我有一项任务将解析​​浏览器用户代理字符串并返回浏览器信息。

虽然我在 lua 上做了很多研发以获得可靠的 LUA 库来完成这项工作,但不幸的是我还没有找到任何人。

所以我尝试通过在我的 lua 脚本中使用一些 PHP UA 代理库逻辑来实现它。根据 PHP 库(php us parser),它对所有可能的用户代理字符串都有自己的正则表达式文件,因此它实际上将所有这些字符串存储在 JSON 文件中,并将传入的 UA 字符串与这些正则表达式文件数据匹配,并返回传入用户代理的完整详细信息.

现在我也在尝试在我的 lua 脚本中复制相同的逻辑,但不幸的是,由于 lua 没有它自己的正则表达式库,我试图用它现有的可用函数解析 UA 字符串。现在我被困在这里实现逻辑。

这是我的 UA 字符串

local ua ="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"

这里是这个字符串的正则表达式代码

local pattern =    [[@(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))?@]]

这是我的代码从 UA 字符串中获取完全匹配

for w in s:gmatch(pattern) do
    ngx.say(w)
end`

运行此代码后,它返回 nil 或 NO 值

即使我也尝试过这种模式 local pattern = [[(Chrome|Chromimum)/%d+]

现在它只返回一个匹配项,即“Chrome”,它应该返回这样的结果

[0] => Chrome/39.0.2171
[1] => Chrome
[2] => 39
[3] => 0
[4] => 2171

每个索引代表浏览器不同的值,如浏览器名称、版本、操作系统名称等。

非常感谢任何帮助。

【问题讨论】:

    标签: lua user-agent string-matching lua-patterns


    【解决方案1】:

    Lua patterns 与正则表达式不同。以下正则表达式:

    (Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))?
    

    将被重写为(注意| 在 lua 模式中无效):

    (Chrom[eium]+)/(%d+)%.(%d+)%.?(%d*)
    

    您可以在work here看到以上内容。

    【讨论】:

    • 应该明确一点,尽管您的 Lua 模式版本可以匹配 Chromium 或 Chrome,但它并不是一个非常准确的正则表达式替换,因为它还会匹配更多不需要的(即 false正)比原来的正则表达式。例如,它也会匹配 Chromeeeemmmm
    • 感谢它为这个给定的 sring 所做的工作。但我想知道我是否有多个字符串将与 UA 字符串匹配。例如,假设我有 (wap[\-\]browser|maui|netfront|obigo|teleca|up\.browser|midp|Opera Mini)@i]] 在这里我如何匹配 netfront 或 telecol 或opera .As都是不同的字符串
    • @VishwanathPandey 纯 lua 模式无法做到这一点。请通过 LPeg 库进行相同的操作。
    • @hjpotter92:我的服务器中安装了 lrex pcre lib。它对我有用吗?
    • @VishwanathPandey 当然。你可以试一试。我的意思是 lua 模式本身不足以满足您的情况。为此,您必须依赖库。
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2011-02-03
    • 2019-03-29
    • 1970-01-01
    • 2011-09-16
    • 2017-01-19
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多