2016-11-23 75 views
1

在我的Rss Feeds閱讀系統中,我需要刪除任何存在的腳本塊,因爲有人說這會讓XmlReader混淆。正則表達式 - 替換太慢

對於我正在做這一塊的代碼,我在網絡上找到:

allXml = Regex.Replace(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)", "$1$2"); 

但這是太慢了...有什麼辦法來執行呢?我已經嘗試先做比賽,但這同樣是緩慢的,就像這樣:

Match rgx = Regex.Match(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)"); 

if (rgx.Success) 
    allXml = Regex.Replace(allXml,"(.*)<script type='text/javascript'>.+?</script>(.*)","$1$2"); 
+0

'allXml'的大小是多少? –

+0

這是工作正常,你無處'type =「text/javascript」'(雙引號)?或者空格。 – maraca

+0

嘗試瞭解您從** web **獲取的代碼。它實際上做了什麼。這樣你就可以清楚你在做什麼。 在這裏您正在尋找'(一切)Javascript(一切)''因爲正則表達式的搜索技術的性質,它將需要時間。 – Rahul

回答

1

第一(.*)抓住全行一次(因爲*是一個貪婪的量詞),然後開始回溯試圖容納所有隨後的模式。如果你的字符串是一個非常長的行,長度爲幾兆字節,那麼對引擎可能會有問題,因爲在它爲模式中定義的每個捕獲組找到適當的字符串塊之前,它必須執行很多步驟。

如果你想有一個正則表達式快速和骯髒的修復,丟棄(.*) s,而只是使用

string res = Regex.Replace(allXml, "(?s)<script type='text/javascript'>.*?</script>", "") 

刪除<script>...</script>子。請注意,(?s)RegexOptions.Singleline(DOTALL)修飾符行內等效項,因此.也可以匹配換行符號。

但是,最好的方法是使用HTML解析器,如HtmlAgilityPack