iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

Lua的strings模組雖然有支援Regex,而Nginx的ngx.re模組效能上號稱更勝Lua的strings。
以下是解析URI的飯粒:

local request_uri = ngx.var.request_uri;
local iterator, err = ngx.re.gmatch(request_uri, "/([^/]\\w+)", "jo");
local encode = require("cjson").encode
if iterator then 
    while true do
        local it, err = iterator()
        if not it then break end
        ngx.say(it[1] .. ', ', encode(it) .. "<br/>")
    end
end

當URL為:http://localhost:8004/api/jemmy/tsai
則ngx.say印出的內容為:

api, {"0":"\/api","1":"api"}
jemmy, {"0":"\/jemmy","1":"jemmy"}
tsai, {"0":"\/tsai","1":"tsai"}

重點在ngx.re.gmatch這裡,和Lua strings模組差別在,ngx.re還是保持有斜線為跳脫字元,而Lua則用%,而它最後一個參數j和o與效能有關。參考:
http://www.hangdaowangluo.com/archives/2731

  • j 啟用PCRE JIT編譯, 需要PCRE 8.21+ 支持,並且必須在編譯時加上選項–enable-jit,為了達到最佳性能,該選項總是應該和’o’選項搭配使用.
  • o 一次編譯模式,啟用worker-process層級的編譯正規表示式的快取.
    單行模式.

上一篇
讀環境變數並解析成Lua的Table物件
下一篇
Java Regex轉\uNNNN為Unicode字元
系列文
正則!好好表達30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言