2009-05-29 154 views
0

我在一個ASP.Net 2.0應用程序中使用VB.Net運行一些正則表達式,刪除一些不必要的標記。其中一個是我想要做的一件事就是刪除沒有在他們的任何屬性的span元素:正確匹配結束標記與HTML中的開始標記與RegEx

output = Regex.Replace(output, "<span\s*>(?<Text>.*?)</span>" & styleRegex, "${Text}", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Singleline) 

因此,對於這個內容:

<span>Lorem <span class="special">ipsum</span> dolor sit amet.</span> 

我想刪除外部跨度元素。不幸的是,我的正則表達式上面給了我這個結果,由於封閉跨度匹配它遇到的第一個:

Lorem <span class="special">ipsum dolor sit amet.</span> 

這可能與一個正則表達式或我將不得不實施一些更先進?

+8

由於這是(在此插入大數字)「我可以用正則表達式解析HTML」主題,所以我將其作爲註釋發佈:正則表達式不能通過它的定義識別嵌套結構。如果您想識別語言(例如「嵌套結構」),請使用解析器。你用正則表達式看到的行爲就像用正則表達式一樣。 – Tomalak 2009-05-29 15:59:39

回答

0

XSLT是不是因爲輸入的選項可能並不總是有效的XML和HTML Agility Pack on Codeplex看起來非常甜蜜,但確實是矯枉過正在這種情況下。下面是我最終使用最終正則表達式:

<span\s*>(?<Text>.*?(?:<span[^>]*>.*?</span>.*?)*)</span> 

更換與${Text}有效地去除無用的外部在我測試過的所有案件span標籤。

0

我會使用XSLT而不是正則表達式。

看來.NET對XSLT有很好的支持(google:xslt vb.net),但我不知道它是否會解析非XHTML。標準的xsltproc命令將使用--html標誌。

2

不幸的是,正則表達式沒有這種力量。你至少需要一個上下文敏感的語言來表達類似的東西。 (對不起theoretical stuff

我也建議使用XSLT代替。

相關問題