我正在解析的页面上有许多 Web 链接,我想捕获所有h3链接,但其中包含特定子元素的链接除外。
示例页面:
<h3 class="r">
<a href="http://Capture This"></a>
</h3>
<some tags here>
<more tags here>
<a bit more tags here>
</div>
</div>
<h3 class="r">
<a href="http://Capture This"></a>
</h3>
<some tags here>
<class=ml>
<more tags here>
<class=tcl>
<a bit more tags here>
</div>
</div>
<h3 class="r">
<a href="http://Dont capture this"></a>
</h3>
<some tags here>
<class=ml>
<more tags here>
<a bit more tags here>
</div>
</div>
捕获 h3 链接:
- 其中不包含class=ml子元素
- 或者包含 class ml 和class=tcl元素
此正则表达式匹配所有h3链接:
h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?
此正则表达式匹配其子元素中没有class=ml的所有h3链接(每个h3元素用 doulbe /div 标签分隔):
h3 class=["']?r["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml).)*(</div>){2,})
最后,我正在寻找的正则表达式捕获所有h3链接,这些链接不包含class=ml,或者在其子元素中同时包含class=ml和class=tcl (按此顺序)
h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml)(?!(</div>){2,}).)*(class=ml((?!class=tcl>).)*class=tcl>|(</div>){2,}))
我附带的正则表达式可以工作,但由于回溯,效率非常低。例如,标准页面匹配的 100 次迭代需要 50 秒才能完成。有没有办法改进这个正则表达式,所以它不会回溯那么多?
我相信我开始了解 HTML 解析Cthulhu 的方式实际上是什么,但希望它不会打扰任何人的睡眠。
PS 我在.NET 正则表达式引擎上,如果这会影响我的选择。