正则表达式匹配HTML样式属性

时间:2009-08-31 21:31:40

标签: regex html-parsing

需要一个正则表达式大师!

<img src="\img.gif" style="float:left; border:0" />
<img src="\img.gif" style="border:0; float:right" />

鉴于上面的HTML,我需要一个匹配“float:right”或“float:left”的正则表达式模式,但仅限于img标签。

提前致谢!

3 个答案:

答案 0 :(得分:4)

/<img\s[^>]*style\s*=\s*"[^"]*\bfloat\s*:\s*(left|right)[^"]*"/i
但是,不得不告诉你:根据我的经验,无论你写什么正则表达式,都会有人能够提出打破它的有效HTML。如果你真的想以一般,可靠的方式做到这一点,你需要解析HTML,而不是抛出正则表达式。

答案 1 :(得分:2)

你真的不应该使用正则表达式来解析html或xml,设计一个可以处理所有极端情况的万无一失的正则表达式是不可能的。相反,我建议为您选择的语言找到一个html解析库。

那就是说,这是使用正则表达式的可能解决方案。

<img\s[^>]*?style\s*=\s*".*?(?<"|;)(float:.*?)(?=;|").*?"

“float:”将在那里唯一的捕获组中捕获,该捕获组应为1号。

正则表达式基本上匹配img标记的开头,后跟任何类型的字符,它不是任何次数的近括号,后跟style属性。在style属性的值中,float:可以是属性中的任何位置,但它应该只匹配实际的float样式(即它前面是属性的开头或分号,后跟分号或属性的结尾)

答案 2 :(得分:0)

我同意Sean Nyman,最好不要使用正则表达式(至少不要使用永久性的东西)。对于ad-hoc和更耐用的东西,您可以尝试:

/<img\s(?:\s*\w+\s*=\s*(?:'[^']*'|"[^"]*"))*?\s*\bstyle\s*=\s*(?:"[^"]*?\bfloat\s*:\s*(\w+)|'[^']*?float\s*:\s*(\w+)/i