关闭

利用lua中的string.gsub来巧妙实现json中字段的正则替换

标签: lua正则
1927人阅读 评论(0) 收藏 举报
分类:

业务需求

工作中需要对某个请求的json响应中的某个字段进行替换, 通常想到的方法是,先使用lua的cjson模块解析该json响应, 取出该json字段再该改写它的值.

在这样实现的过程中,遇到一些问题,表现如下:

(1).上面的方法需要经过json解码, 修改字段值, json编码的过程, 在json编码过程中, 会将完整的url进行转义,比如

http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4

会被转义为

http:\/\/101.227.23.53\/videos\/v0\/20151026\/88\/fc\/8adcec584a283b2ce0aacb15092918f5.mp4

这不是我们需要的,因为我们还需要将\去掉,比较繁琐;

(2).有些响应是js片段, 而不是标准的json

这样套用cjson处理的话,将会出错, 而且实际线上的情况非常复杂, 异常处理非常不好处理, 比如, 可能返回这样的响应

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/lua

function 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)

运行截图


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:880137次
    • 积分:11467
    • 等级:
    • 排名:第1348名
    • 原创:345篇
    • 转载:38篇
    • 译文:1篇
    • 评论:111条
    自我简介
    本人帝都码农一枚,喜钻研代码,搞过流媒体,P2P,搜索,浏览器,精准广告,目前在一家创业公司专注于cdn和运营商缓存的研发,欢迎志同道合者交流技术,切磋心得,共同进步!该博客是业余总结开发中的经验教训,梳理思路的结晶。博文如有不妥之处,请高人不吝赐教,若有侵犯版权的地方,请联系我删除。 Email:tao_627@aliyun.com
    最新评论