stone

使用正则匹配url中的任意参数
众所周知,get请求中的参数是没有固定的顺序的,那如何使用正则去匹配带有指定参数的http请求呢?在做大数据分析时...
扫描右侧二维码阅读全文
29
2016/11

使用正则匹配url中的任意参数

众所周知,get请求中的参数是没有固定的顺序的,那如何使用正则去匹配带有指定参数的http请求呢?

在做大数据分析时,第一步是进行数据采集,其中有一个比较常见的做法是对http进行正则识别,将其映射为相应的操作,但是这里由一个很大的坑,
http请求中参数的顺序是不定的,例如乐视视频的相关操作的http中带有一个vid参数,但是这个vid参数在url中的位置是不定的,所以我们写的
正则就不能带有顺序。下面介绍一个小方法:

http://apple.www.letv.com/va/?act=ac&atype=13&ia=0&err=0&lc=70d6e0f0490f3b50410ac6cdda789b63&ver=2.0&aps=aps_h5_2.1.24&ch=letv&cid=2&ct=0&dur=0&dur_total=0&pid=10015173&r=601741878760&cur_url=http%253A%252F%252Fwww.le.com%252Fptv%252Fvplay%252F24185783.html&ry=1&ref=http%253A%252F%252Fwww.le.com%252F&sys=1&py=0%26ark%3D134&uuid=1259177644495991&pv=3.7.0&vid=24185783&vlen=1222&p1=0&p2=06&ty=0&ctime=1479259178061&ut=85

这里是一条乐视的广告缓存的http请求,当播放器开始缓存广告的时候,就会发送一条这样的http请求,进行数据统计。现在我们想以act,actype,还有vid作为这个url的特征去写一个
正则。

http://apple.www.letv.com/va(?:(?:(?:.*[\?&]act=ac)|(?:.*[\?&]atype=\d+))|(?:.*[?&]vid=24185783)){3}

前面的不用说了,主要看后面,()表示分组,而在正则中,分组是可以指定名字的,写法如下(name:expression),如果name为?,则表示不保留这个分组。
| 表示或者,所以这个正则表示匹配act或者atype或者vid三次,因为url里面的参数不会重名,所以这样就可以去掉这些参数的相对位置关系了

另外一个值得注意的地方是act前面的[?&],如果不加这个,则可能会把某些以act结尾的参数识别出来。前面加.*表示其他可能出现的东西。

Last modification:September 7th, 2018 at 08:23 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment