2016-03-03 37 views
2

我存儲在一個Java代碼的字符串變量的HTML代碼「改造」 CSS樣式,在這個字符串我有這樣的事情:在Java中使用正則表達式中的HTML標籤的風格

<span style="text-decoration: underline;">test</span> 

而且我想是這樣的

<u>test</u> 

或者,如果我有這樣的:

<span style="color: #2873ee; text-decoration: underline;">test</span> 

我想這一點:

<font color="#2873ee"><u>test</u></font> 

使用正則表達式我可以這樣做:

affectedString.replaceAll("<span style=\"text-decoration: underline;\">(.*?)<\\/span>", "<u>$1</u>"); 

affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>"); 

容易吧?但我有幾個問題,也不喜歡這個代碼。 首先,我爲什麼不喜歡這個?因爲我需要在CSS樣式使用此:下劃線,顏色和線通過,並寫巧合的每一種情況下是不是一個很好的代碼,例如:

affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>"); 
affectedString.replaceAll("<span style=\"text-decoration: underline; color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3});\">(.*?)<\\/span>", "<u><font color=\"$2\">$1</u></font>"); 

而且問題是這不工作與像一個代碼:

<span style="text-decoration: underline;">test <span style="text-decoration: line-through;">two</span></span> 

在當我嘗試應用該正則表達式這種情況下,部分匹配,直到第一</span>,所以最後的結果是:

<u>test<span style="text-decoration:line-through;">two</u></span> 

這是當我匹配文本修飾:下劃線,然後當我匹配文本修飾:直通。第二個結果是:

<u>test <strike>two</u></strike> 

當預期的結果是

<u>test <strike>two</strike></u> 

我的問題是,什麼樣的正則表達式我可以用它來解決這類問題?將這個簡單的css「轉換」成html標籤有更好的解決方案嗎?

謝謝

+0

你不應該使用正則表達式解析XML/HTML。 – user2004685

+0

任何你或其他答案者爲這樣的任務提供的任何正則表達式都會很複雜,容易出錯並且看起來很醜陋。你確實需要某種類型的html分析器/解析器 –

回答

1

我建議不要使用正則表達式。調試/擴展並不容易,並且非常快速。您可以使用像jsoup這樣的庫來解析HTML,遍歷DOM並使用CSS選擇器來獲取元素。例如。獲取與class所有div屬性,你會使用

Elements divs = doc.select("div[class]");