2012-06-14 30 views
1

我需要找到一種方法來刪除font-family樣式中圍繞字體名稱的單引號標記。解析html樣式屬性中的引號標記

所以這...

<span style="font-family: 'Verdana'; color: #0000ff; font-size: 10pt;"><span style="font-family: 'Arial';"><strong>2.0: Scope</strong></span></span> 

會改變這個...

<span style="font-family: Verdana; color: #0000ff; font-size: 10pt;"><span style="font-family: Arial;"><strong>2.0: Scope</strong></span></span> 

我只關心由引號包圍樣式屬性。如果它們被單引號包圍,那麼我知道字體名稱不會被單引號包圍。

我必須在C#中執行此操作,因爲處理此Html的應用程序正在作爲Windows服務運行。

我知道通常使用正則表達式來解析Html是否定的,但是我希望這可能是一個異常,因爲我正在尋找一個非常特殊的情況。我有權訪問Html解析器,但與正則表達式相比非常慢。

這是我能想出...

var html = "<span style=\"font-family: 'Verdana'; color: #0000ff; font-size: 10pt;\"><span style=\"font-family: 'Arial';\"><strong>2.0: Scope</strong></span></span>"; 
var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:(.*?)[\">]", m => m.Value.Replace("'", "")); 

其達到正確的目標,但並沒有真正找到正確的比賽是最好的。它匹配這個...

style="font-family: Verdana; color: #0000ff; font-size: 10pt;"><span style="font-family: Arial;" 

我想要做的就是找到這樣的兩場比賽...

style="font-family: 'Verdana'; color: #0000ff; font-size: 10pt;" 
style="font-family: 'Arial';" 

,並作爲一個新手,正則表達式的傢伙,我似乎無法找到合適的組合。

或者更具體一些,我需要一種方法來查找單引號包圍的字體族中的值,然後從該值中刪除單引號。

有人可以幫我拿出適當的正則表達式嗎?
在這種情況下是否有更好的正則表達式替代方案?

+0

「我只關心雙引號包圍的樣式屬性,如果它們被單引號包圍,那麼我知道字體名稱不會被單引號括起來。」 這是什麼意思? – krillgar

+0

如果html看起來像這樣style ='而不是style =「,那麼我知道字體名稱不會被單引號包圍。 –

回答

1

這裏是我如何解決它?

var html = "<span style=\"font-family: 'Verdana'; color: #0000ff; font-size: 10pt;\"><span style=\"font-family: 'Arial';\"><strong>2.0: Scope</strong></span></span>"; 
var newHtml = Regex.Replace(html, "style\\s*=\\s*\"[^\"]*\\bfont-family:.*?'.*?(;|\")", m => m.Value.Replace("'", ""); 

感謝樓指導我在正確的方向。

1

這是因爲正則表達式匹配是貪婪 - 它會嘗試匹配匹配的最長字符串。

var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:(.*?)[\">]", m => m.Value.Replace("'", "")); 

你的問題是FONT-FAMILY後(.*?) - 它會繼續下去,甚至過去的關閉標籤。一個簡單的修正是

var newHtml = Regex.Replace(html, "style(.*)=(.*)\"(.*)font-family:([^>]*?)[\">]", m => m.Value.Replace("'", "")); 

[^>]^意味着不這些字符。

當然,這些都是黑客 - 絕對是真正的HTML,這是行不通的。

+0

我研究過貪婪vs懶惰匹配是如何工作的,並且能夠解決我的問題。爲了指引我朝着正確的方向。 –

0

通行證每次你進入這個函數的字符串:

private static string RemoveSingleQuote(string psHTML) { 
    // If it starts with the single quote after "style=" then, just return the string. 
    if (psHTML.StartsWith("<span style=\'")) return (psHTML); 

    StringBuilder sb = new StringBuilder(); 

    foreach (char c in psHTML) { 
     if (c != '\'') { 
      sb.Append(c); 
     } 
    } 

    return (sb.ToString()); 
}