在這裏需要正則表達式的主人!正則表達式匹配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