2009-12-10 125 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