在这里需要正则表达式的主人!正则表达式匹配HTML样式属性
<img src="\img.gif" style="float:left; border:0" />
<img src="\img.gif" style="border:0; float:right" />
鉴于上述HTML,我需要一个正则表达式模式将匹配“浮动:权利”或“浮动:左”,但只有在img标签。
在此先感谢!
在这里需要正则表达式的主人!正则表达式匹配HTML样式属性
<img src="\img.gif" style="float:left; border:0" />
<img src="\img.gif" style="border:0; float:right" />
鉴于上述HTML,我需要一个正则表达式模式将匹配“浮动:权利”或“浮动:左”,但只有在img标签。
在此先感谢!
/<img\s[^>]*style\s*=\s*"[^"]*\bfloat\s*:\s*(left|right)[^"]*"/i
不得不提醒你,虽然:在我的经验,无论你写的正则表达式,有人能够拿出打破它有效的HTML。如果你真的想以一种通用可靠的方式来做到这一点,你需要解析HTML,而不是扔正则表达式。
你真的不应该使用正则表达式来解析html或xml,这是不可能的设计一个万无一失的正则表达式,将处理所有的角落情况。相反,我会建议为您的语言选择一个html解析库。
这就是说,这是一个使用正则表达式的可能解决方案。
<img\s[^>]*?style\s*=\s*".*?(?<"|;)(float:.*?)(?=;|").*?"
“浮动:”将唯一的捕获组在那里被捕获,这应该是数字1。
正则表达式基本上img标签的开始,随后的任何类型的字符的匹配不是任何次数的括号,后面跟着style属性。在style属性的值中,float:可以在属性中的任何位置,但它只能匹配实际的float类型(即,它的前面是属性的开始或分号,后面跟着分号或属性的末尾) 。
测试此C#代码:
string[] test = new String[] {
"<img src=\"\\img.gif\" style=\"float:left; border:0\" />",
"<img src=\"\\img.gif\" style=\"border:0; float:right\" />"
};
Regex regex = new Regex(@"\<img[^>]*?style[\s]*?=.*?float:([\w]+).*?/\>", RegexOptions.Compiled);
foreach (String s in test)
{
Match match = regex.Match(s);
if (match.Success)
{
Console.WriteLine(match.Groups[1].Value);
}
}
我与肖恩·尼曼同意,最好不要使用正则表达式(至少不是什么永久性的)。对于某些特别的东西和更持久的东西,您可以尝试:
/<img\s(?:\s*\w+\s*=\s*(?:'[^']*'|"[^"]*"))*?\s*\bstyle\s*=\s*(?:"[^"]*?\bfloat\s*:\s*(\w+)|'[^']*?float\s*:\s*(\w+)/i
您在使用哪种语言? – gnarf 2009-08-31 21:35:00
[可以提供一些例子,说明为什么很难用正则表达式分析XML和HTML?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-为什么它很难解析xml和html-with-a-rege) – 2011-07-09 20:59:31
[RegEx match open tags not except XHTML self-contained tags](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2011-09-15 14:10:49