Сопоставление шаблонов агента пользователя в lua

Я новичок в языке сценариев lua, поэтому просто пробую свои силы в этом языке. У меня есть одна задача, которая будет анализировать строку пользовательского агента браузера и возвращать информацию о браузере.

Хотя я провел много исследований и разработок на lua, чтобы получить надежную библиотеку LUA, которая выполняет эту работу, но, к сожалению, я никого не нашел.

Поэтому я попытался реализовать это, используя некоторую логику библиотеки агентов PHP UA в моем сценарии lua. В соответствии с библиотекой PHP (парсер php us) у нее есть собственный файл регулярных выражений для всех вероятных строк пользовательского агента, поэтому он фактически сохраняет все эти строки в файле 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

Где каждый индекс представляет разные значения браузера, такие как имя браузера, версия, имя ОС и т. д.

Любая помощь очень ценится.


person Vish    schedule 23.02.2017    source источник


Ответы (1)


Шаблоны Lua не совпадают с регулярными выражениями. Следующее регулярное выражение:

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

будет переписано как (обратите внимание, что | недействителен в шаблонах lua):

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

Вы можете увидеть это на здесь.

person hjpotter92    schedule 23.02.2017
comment
Следует уточнить, что, хотя ваша версия шаблона Lua будет работать для сопоставления с Chromium или Chrome, это не совсем точная замена регулярному выражению, поскольку она также будет соответствовать гораздо большему количеству нежелательных (то есть ложных срабатываний), чем исходное регулярное выражение. Например, он также будет соответствовать Chromeeeemmmm - person tonypdmtr; 23.02.2017
comment
Спасибо. Это работает для этой строки. Но мне интересно, есть ли у меня несколько строк, которые будут сопоставляться со строкой UA. например, скажем, если у меня есть (wap[\-\]browser|maui|netfront|obigo|teleca|up\.browser|midp|Opera Mini)@i]] Вот как я могу сопоставить netfront, телекол или оперу. Как все разные строки - person Vish; 27.02.2017
comment
@VishwanathPandey Вы не можете сделать это с чистыми шаблонами lua. Для этого воспользуйтесь библиотекой LPeg. - person hjpotter92; 27.02.2017
comment
@hjpotter92: у меня на сервере установлена ​​библиотека lrex pcre . Будет ли это работать для меня? - person Vish; 27.02.2017
comment
@VishwanathPandey Конечно. Вы можете попробовать. Я имел в виду, что шаблоны lua сами по себе недостаточны для вашего случая. Для этого вам придется полагаться на библиотеку. - person hjpotter92; 27.02.2017
comment
@hjpotter92: я использую lrex lib, и после включения ее библиотеки и вызова ее функции, например, local brow = rex.gmatch(s, m), где s = строка ua, m — шаблон, я получаю следующую ошибку. попытка объединить локальную «бровь» (значение функции) - person Vish; 27.02.2017
comment
@VishwanathPandey Я бы порекомендовал задать новый вопрос, относящийся к самому lrex. У меня нет опыта с тем же. Прости! - person hjpotter92; 27.02.2017