2012-08-29 102 views
0

我有使用正則表達式準備字符串的問題。 我寫了這個功能:使用C#去除HTML標籤

private String parseAnswer(String res) 
    { 
     String[] pattern = new String[16] { "<head[^>]*?>.*?</head>", "<style[^>]*?>.*?</style>", "<script[^>]*?.*?</script>", "<object[^>]*?.*?</object>", "<embed[^>]*?.*?</embed>", "<applet[^>]*?.*?</applet>", "<noframes[^>]*?.*?</noframes>", "<noscript[^>]*?.*?</noscript>", "<noembed[^>]*?.*?</noembed>", "</?((address)|(blockquote)|(center)|(del))", "</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))", "</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))", "</?((table)|(th)|(td)|(caption))", "</?((form)|(button)|(fieldset)|(legend)|(input))", "</?((label)|(select)|(optgroup)|(option)|(textarea))", "</?((frameset)|(frame)|(iframe))" }; 
     String[] replacement = new String[16] { " ", " ", " ", " ", " ", " ", " ", " ", " ", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0" }; 

     for (int i = 0; i < pattern.Length; i++) 
     { 
      res = Regex.Replace(res, pattern[i], replacement[i]); 
     } 

     return res; 
    } 

這個函數獲取HTML代碼作爲輸入。我想清除一些HTML標籤。要做到這一點,我準備了陣列的模式。但似乎我的功能並沒有清除HTML代碼。 我的模式是我想要移除的HTML標記列表。我不刪除一些標籤,但只添加\ n。

你能幫我這個正則表達式嗎?或者給我任何圖書館做任務?我的目標是刪除HTML標籤,只接收網站文本解析。

編輯: 好吧我可以使用HTMLAgilityPack,但我有幾個問題: htmlDoc.LoadHtml(URL); - 我需要翻譯結果爲UTF8 - > HTMLAgilityPack有任何功能轉換? 第二個通常我想將InnerText的結果放到Json併發送給Javascript。 我如何刪除字符與禁止在Javascript中?

回答

6

Regex傾向於是poor choice for parsing HTML,特別是來自不同的來源。

我建議使用內置解析器目的,如改爲HTML Agility Pack

什麼是完全的HTML敏捷性包(HAP)?

這是一個敏捷的HTML解析器,它構建了一個讀/寫DOM並支持普通的XPATH或XSLT(實際上,您不需要理解XPATH或XSLT就可以使用它,不用擔心)。它是一個.NET代碼庫,允許您解析「離開網頁」的HTML文件。解析器對「真實世界」格式錯誤的HTML非常寬容。對象模型與提出System.Xml非常相似,但是對於HTML文檔(或流)。

源代碼下載附帶了許多示例項目,這些項目記錄瞭如何將庫用於不同的任務。