利用lua中的string.gsub来巧妙实现json中字段的正则替换
業(yè)務(wù)需求
工作中需要對(duì)某個(gè)請(qǐng)求的json響應(yīng)中的某個(gè)字段進(jìn)行替換, 通常想到的方法是,先使用lua的cjson模塊解析該json響應(yīng), 取出該json字段再該改寫它的值.
在這樣實(shí)現(xiàn)的過程中,遇到一些問題,表現(xiàn)如下:
(1).上面的方法需要經(jīng)過json解碼, 修改字段值, json編碼的過程, 在json編碼過程中, 會(huì)將完整的url進(jìn)行轉(zhuǎn)義,比如
http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4
會(huì)被轉(zhuǎn)義為
http:\/\/101.227.23.53\/videos\/v0\/20151026\/88\/fc\/8adcec584a283b2ce0aacb15092918f5.mp4
這不是我們需要的,因?yàn)槲覀冞€需要將\去掉,比較繁瑣;
(2).有些響應(yīng)是js片段, 而不是標(biāo)準(zhǔn)的json
這樣套用cjson處理的話,將會(huì)出錯(cuò), 而且實(shí)際線上的情況非常復(fù)雜, 異常處理非常不好處理, 比如, 可能返回這樣的響應(yīng)
var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};
或者
[{"fileid":"030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4","server":"http://111.206.106.204/youku/69780130BBF468394EFD494E56/030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4"}]
解決方法
放棄json的解碼和編碼, 直接采用字符串的正則匹配替換.這樣處理更簡練
下面是處理源碼
#!/usr/bin/luafunction mod_hosts(h, s)return h .. "10.10.110.162:8081/" .. s .. "/acjf92lbq/"
end--利用正則匹配來替換指定部分的host字段
s = 'var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};'
l = string.gsub(s, '(\"l\"%s*:%s*\"http://)(.-)/', mod_hosts("%1", "%2"))
print(l)
運(yùn)行截圖
總結(jié)
以上是生活随笔為你收集整理的利用lua中的string.gsub来巧妙实现json中字段的正则替换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu 14.04 64bit上
- 下一篇: ATS缓存数据结构