正则表达式解析http头及html

最近需要自己实现解析http协议,获取html标签内容等操作。感觉正则表达式基本能够完成这个任务,不过我对正则表达式的掌握还停留在这个水平:

不得已,先提升一下对正则表达式的掌控吧。由于用的是deelx,所有首先就是DEELX 正则表达式语法,看了之后觉得有所顿悟,可以理解<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>这种匹配标签的了。不过仔细想想觉得这个东西有bug:注释里的标签会干扰匹配。这时脑子里有两个小人开始了讨论。一个说,把注释改了再匹配;一个说,自己解析吧。被他俩吵的烦了,我觉得把他俩都打死,哥要再了解下正则表达式,我总觉得它能解决这个问题。先弄一个精通正则表达式.pdf看看,虽然感觉这本书不太适合我,不过至少我觉得我应该好好了解一下环视。后来发现深入理解正则表达式环视的概念与用法这个文章,感觉叫深入解析、深入理解的应该都可以。看了之后果然觉得我确实深入理解了正则表达式。让我们来排除注释中的内容把!

首先找注释里的内容很简单,<!__[\s\S]*?__>。这时候找注释里的<head>标签时,很容易想到<!__[\s\S]*?<head>[\s\S]*?__>。可稍微再想想,这还是有问题的,<head>前后都有注释时,也能匹配到。注释里的标签必须满足前面有<!__但是在<!__和<head>之间没有__>。<!__[\s\S]*?<head>已经能确保出现注释开头了,只要排除一下注释结尾即可。

然后改成了这个样子:(<!__((?!__>)[\s\S])*?)<head>试了一下,果然能找到注释里的head了。那否定一下,就是非注释里的head了呗:(?<!<!__((?!__>).)*?)<head>。这种写法每找一个位置就先看看是不是再注释里,感觉上比较浪费性能,于是弄成先找<head>,再看是否再注释里,所以最终版就是<head>(?<!<!__((?!__>).)*?)。这两种写法里环视中((?!__>).)*?匹配到的内容是不一样的。

这也就是说,要排除注释中的标签,只要加一个(?<!<!__((?!__>).)*?)即可。所以<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>加了之后就变成:

<(?<HtmlTag>[\w]+)[^>]*?>(?<!<!__((?!__>).)*?)((?<Nested><\k<HtmlTag>[^>]*>(?<!<!__((?!__>).)*?))|</\k<HtmlTag>>(?<-Nested>(?<!<!__((?!__>).)*?))|.*?)*</\k<HtmlTag>>(?<!<!__((?!__>).)*?)。

这里面环视中使用重复量词貌似就deelx支持,大部分正则引擎都不太支持。不过正好我用的就是deelx。

标签问题解决了就是解析http协议头里的数据了,相对来说简单点:

http/\d\.\d\s(\d{0,3})\s\w+(?:\n(?:(?:content-type:\s([^\n]+))|(?:set-cookie:\s([^\n]+))|[^\n]+))*(?:\n\n([\s\S]*))?

试了一下,匹配结果如下:

这里想要获得什么字段值就继续往里|上就行,想要方便了还可以命个名。排除注释

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值