2012-04-17 124 views
2

我從某些html中刪除所有樣式屬性。我可以使用正則表達式正則表達式匹配html樣式屬性的有效值

/style=("[^"]"|'[^']')/ 

但我不知道這是否是低效的(由於負匹配)。我也知道它很容易受到可以包含引號的樣式屬性(例如背景圖像)的影響。

是否有一個正則表達式可以用來匹配有效的樣式字符串,或者像使用正則表達式解析html一樣,這對於正則表達式來說是一項任務難以執行的任務嗎?

*編輯這裏是(我認爲)中最棘手的風格字符串中的HTML我刮

style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'" 
+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Sibster 2012-04-17 10:39:51

+0

@Sibster我知道這個問題的答案及的,但我的問題比這個窄得多 – wheresrhys 2012-04-17 10:44:48

+0

你可能想看看我更新的答案。 – 2012-04-17 11:09:04

回答

1

我不認爲,負匹配是在任何情況下慢。畢竟,當您提供起始點style=時,以下字節與模式進行比較。

但是,您必須滿足這種情況,其中屬性爲而非用引號括起來。

/style=(".*?"|'.*?'|[^"'][^\s]*)/s 

應匹配HTML屬性語法的所有產物。但是,請確保點與您的正則表達式引擎中的所有字符匹配,包括換行符(因此爲/s)。我也用非貪心量詞*?。這些也可能沒有實現。

存在style=的特殊情況,沒有任何以下值,這在上面沒有表示以保持簡單。

0

嘗試/ style\=[\"\']?([a-zA-Z0-9 \:\-\#\(\)\.\_\/\;\'\,]+)\;?[\"\']? /ig

它應該找到每一個樣式屬性我知道。

http://jsfiddle.net/DULyx/3/ - 點擊這裏

+2

'url's可能會被引用。 – Christoph 2012-04-17 10:51:28

+0

很好的努力,但它在'style ='FONT-FAMILY:'Verdana'''上失敗。一般來說,我認爲正則表達式必須是'/(「[allvalidchars和'] +」|('[allvalidchars和「] +')/'來避免這個陷阱,這是非常令人煩惱的,因爲它意味着a)複製字符類或b)將其存儲爲字符串elsewher,並且在連接並傳遞到'new RegExp()'之前必須正確地轉義事物。即使如此,它也容易受到'style ='FONT-FAMILY:\'的影響。 Verdana \''' – wheresrhys 2012-04-17 22:16:56

+0

根據你的建議,沒有任何正則表達式可以做到這一點,既然你想定義一個搜索規則 - 規則必須由css writer來規定。一旦腳本不遵循規則 - 您如何通過它進行搜索? – 2012-04-17 23:43:29

0

您不應該將HTML作爲字符串處理。所有你需要在JS是elt.style='';。如果你有機會通過XSLT運行你的東西,這是一個單線程。

0
function trim (str) { 
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
} 

function getStyle(element){ 
    return parseRules(element.getAttribute('style')) 
} 

function parseRules(rules){ 
    var parsed_rules= {} 
     rules.split(';').map(function(rule){ 
      return rule.split(':').map(function(rule,index){ 
      // HERE YOU CAN TRY TO CLEAN THE RULES 
      return trim(rule) 
      }) 
     }).filter(function(rule){ 
      // HERE YOU CAN TEST THAT THE RULE IS VALID 
      return rule.length == 2 && ((rule[0]!="") || (rule[1]!="")) 
     }).forEach(function(rule){ 
     parsed_rules[rule[0]] = rule[1] 
     }) 


    return parsed_rules 
}