2009-08-31 122 views
0

在这里需要正则表达式的主人!正则表达式匹配HTML样式属性

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

鉴于上述HTML,我需要一个正则表达式模式将匹配“浮动:权利”或“浮动:左”,但只有在img标签。

在此先感谢!

+0

您在使用哪种语言? – gnarf 2009-08-31 21:35:00

+0

[可以提供一些例子,说明为什么很难用正则表达式分析XML和HTML?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-为什么它很难解析xml和html-with-a-rege) – 2011-07-09 20:59:31

+0

[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

回答

3
/<img\s[^>]*style\s*=\s*"[^"]*\bfloat\s*:\s*(left|right)[^"]*"/i 

不得不提醒你,虽然:在我的经验,无论你写的正则表达式,有人能够拿出打破它有效的HTML。如果你真的想以一种通用可靠的方式来做到这一点,你需要解析HTML,而不是扔正则表达式。

+0

你是男人。 – Kappers 2009-08-31 21:43:20

+1

不知道为什么有人会这样做,但是'style="float:left"' – 2009-08-31 21:45:49

+0

或者对于style属性使用单引号。或者对于style属性使用* no *引号。或者在样式属性之前将完整的HTML标签嵌入到有效支持值的属性中。就像我说的,如果你想要任何接近可靠性的东西,你必须解析。 – chaos 2009-08-31 21:52:17

2

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

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

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

“浮动:”将唯一的捕获组在那里被捕获,这应该是数字1。

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

0

测试此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); 
       } 
      } 
0

我与肖恩·尼曼同意,最好不要使用正则表达式(至少不是什么永久性的)。对于某些特别的东西和更持久的东西,您可以尝试:

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