2009-12-10 46 views
1

我有一個包含html的字符串輸入緩衝區。 這個html包含了很多文字,包括一些我想要解析的東西。 什麼實際上,我所尋找的是這樣的臺詞: 「< STRONG>文件名</STRONG>:yadayada.thisandthat.doc </P>」c#:從html解析文本

(雖然位置和空白的量/分號是可變的)

什麼是將所有文件名列入列表的最佳方式< string>?

+0

正則表達式是(可能最快)的選項。我在正則表達式很糟糕,所以有人可能會發布正則表達式解決方案:) – RvdK

+0

@PoweRoy正則表達式是編寫代碼最快的,但不是查找字符串。如果速度很重要並且html很長,那麼字符掃描方法會更快。像狀態機一樣,它應該很乾淨。但是,直到性能問題,使用正則表達式。 –

回答

0

我不知道正則表達式是做到這一點的最好辦法,遍歷HTML樹可能是比較明智​​的,但下面的正則表達式應該這樣做:

<\s*strong\s*>\s*Filename\s*<\s*/strong\s*>[\s:]*([^<]+)<\s*/p\s*> 

正如你所看到的,我一直非常容忍空白,並且容忍文件名的內容。此外,還允許使用多個(或不包含)分號。

的C#建立一個清單(把我的頭頂部):

List<String> fileNames = new List<String>(); 
Regex regexObj = new Regex(@"<\s*strong\s*>\s*Filename\s*<\s*/strong\s*>[\s:]*([^<]+)<\s*/p\s*>", RegexOptions.IgnoreCase); 
    Match matchResults = regexObj.Match(subjectString); 
    while (matchResults.Success) { 

      fileNames.Add(matchResults.Groups[0].Value); 

     matchResults = matchResults.NextMatch(); 
    } 
+0

非常感謝!我一回家就會放棄! – Pygmy

1

那麼一個正則表達式來完成這將是非常困難的寫作,並最終會變得不可靠無論如何。

也許你最好的選擇是有一個你想尋找的擴展名(.doc,.pdf等)的白名單,並通過html拖網尋找這些擴展的實例。當你找到一個,追溯到下一個空白字符,那就是你的文件名。

希望這會有所幫助。

+0

忘了提及我不知道文件名將會是什麼 - 有或沒有擴展名等... – Pygmy

+0

文件名甚至可以在其中有空格,不是嗎? – Pygmy

+0

他們*可以*,但他們*是否應該*是另一回事。 –

1

您有幾個選項。你可以使用正則表達式,它可能類似於Filename:(。*?)</p>,但它需要更加複雜。您需要查看更多的文本文件以編寫適當的文本文件。這可能取決於你的所有文本的結構,如果文件名後總是有特定的標籤。

如果它是有效的HTML,您還可以使用HTML解析器(如HTML Agility Pack)來瀏覽html並從某些標記中拉出文本,然後使用正則表達式分離出路徑。

+0

+1。它非常強大。 – Mikos