我正在尝试编写一个正则表达式来匹配图像标记上的src,width和height属性。宽度和高度是可选的。
我想出了以下内容:
(?:<img.*)(?<=src=")(?<src>([\w\s://?=&.]*)?)?(?:.*)(?<height>(?<=height=")\d*)?(?:.*)(?<width>(?<=width=")(\d*)?)?
expresso显示这只匹配以下html代码段的src位
<img src="myimage.jpg" height="20" />
<img src="anotherImage.gif" width="30"/>
我希望我真的很亲密,这里的某个人可以指出我做错了什么,我有一种感觉它是我在字符之间的可选位(?:。*)我试过让它变得非常贪婪没有成功。那么有什么指针吗?
答案 0 :(得分:9)
使用正则表达式从HTML中提取值总是一个错误。 HTML语法可能首先出现得非常复杂,而且即使是非常复杂的正则表达式,页面也很容易识别出来。
改为使用HTML Parser。
This question has been asked before将再次被问到。正则表达式对于这个问题似乎是一个很好的选择,但它们不是。
答案 1 :(得分:3)
正则表达式在解析HTML方面根本不好(请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex?了解原因)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅Can you provide an example of parsing HTML with your favorite parser?。
答案 2 :(得分:1)
在大多数正则表达方言中,.*
是“贪婪的”并且会超越;使用.*?
代替“尽可能少”。
答案 3 :(得分:1)
我没有机会测试它,但也许这对你有用(注意我没有使用命名匹配):
<img(?:(\s*(src|height|width)\s*=\s*"([^"]+)"\s*)+|[^>]+?)*>