2009-08-31 121 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