正则表达式是做文本解析工作必不可少的技能。如Web服务器日志分析,网页前端开发等。很多高级文本编辑器都支持正则表达式的一个子集,熟练掌握正则表达式,经常能够使你的一些工作事半功倍。例如统计代码行数,只需一个正则就搞定。嵌套Html标签的匹配是正则表达式应用中一个比较难的话题,因为它涉及到的正则语法比较多,也比较难。因此也就更有研究的价值。
今天由于工作的需求,需要获取html标签的属性值,立即想到了正则表达式,标签如下:
<circle id="ap_test" cx="200" cy="2000" r="2" stroke="black" stroke-width="0" fill="red"/> <circle id="ap_test" cx="201" cy="2001" r="2" stroke="black" stroke-width="0" fill="red"/> <circle id="ap_test" cx="202" cy="2002" r="2" stroke="black" stroke-width="0" fill="red"/> <circle id="ap_test" cx="203" cy="2003" r="2" stroke="black" stroke-width="0" fill="red"/>
需要获取<circle />标签的cx、cy的属性值,想了一会写出了一个:
$circle是上面的circle标签的内容
preg_match_all('/<\s*circle\s+[^>]*")(.*")(.*"color: #ff0000">下面给大家介绍下正则匹配闭合HTML标签(支持嵌套)任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题。关于正则引擎的原理,推荐《Mastering Regular Expression》中文名叫《精通正则表达式》。挺不错的一本书。
OK,先确定我们要解决的问题——从一段Html文本中找出特定id的标签的innerHTML。
这里面最大的难点就是,Html标签是支持嵌套的,怎么能够找到指定标签相对应的闭合标签呢?
我们可以这样想,先匹配最前面的起始标签,假设是div吧(<div),接着一旦遇到嵌套div,就“压入堆栈”,后面如果遇到div闭合标签了,就“弹出堆栈”。如果遇到闭合标签的时候,堆栈里面已经没有东西了,那么匹配结束,此结束标签为正确的闭合标签。
我之所以能够这样去思考,是因为我了解过正则的特性,我知道正则中的平衡组能够实现我刚才说的“堆栈”操作。所以,如果我们要编写复杂正则表达式,需要对正则的一些高级特性至少有所了解,这样我们思考问题才有个方向。
================================
匹配任意闭合HTML标签的正则表达式:
<("htmlcode"><("htmlcode"><("']?)footer(?(Quote)\k<Quote>)[^>]*?(/>|>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag(?<-Nested>)|.*?)*</\k<HtmlTag)这个正则匹配任意id为footer的HTML标签
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。