正则表达式从HTML中提取所有文件

时间:2012-10-02 22:18:38

标签: regex extract

使用正则表达式我想提取一些HTML文本中包含的文件或图像的所有链接。尝试了几个例子,但他们失败的原因很多(主要是我不熟悉正则表达式:))

1)首先我试过这个:

> Regex("<img[^>]+src=[""']([^""']+)[""']", RegexOptions.Singleline Or
> RegexOptions.IgnoreCase)

(适用于图像)

2)然后这个:

Regex("href=[""']([^""']+)[""']", RegexOptions.Singleline Or RegexOptions.IgnoreCase)

1)提取所有图像,它工作正常,但这只是部分解决方案。 2)提取所有href =“asdf”,但我想只提取指向文件的href,我不想要锚点(#middlesection)或.aspx甚至没有像href =“www.google.com/site”这样的扩展名的网址

我想知道如何从给定文本中提取所有文件,作为文件的任何以点和三个字符结尾的链接:)

我对“.aspx”或“.html”不感兴趣,既不像“id_content = 99”这样的无扩展名网址,也不喜欢“#anchor123”这样的锚点。

是否可以将其打包成一个RegExp?所有这一切背后的想法是我必须将某些HTML中引用的每个文件从一个地方复制到另一个地方,因此我需要一个仅包含要复制的文件路径的ArrayList。

提前致谢!

添加了一些示例代码,只是为了澄清这与“野外”html

无关

提供此代码:

<p>This is a paragraph</p>
<br>
<a href="#someplace">Go to someplace</a>
<ul>
    <li><p><a href="../files/document.pdf">Important PDF 1</a></p></li>
    <li><p><a href="../files/document.xls">Important XLS</a></p></li>
</ul>
<a href="content.aspx?id_content=55">Go to content 55</a>
<br>
<img src="../images/nicelogo.jpg">

我想得到这个:

"../files/document.pdf"
"../files/document.xls"
"../images/nicelogo.jpg"

我不想得到这个:

"#someplace"
"content.aspx?id_content=55"

多数民众赞成,凭借我拥有的reg exp,我获得了所有链接,我只想要那些代表文件的链接。 HTML是由我手工编写的(长篇故事)所以不会有奇怪的双引号或格式错误的标签或奇怪的字符。

我知道它可以做,因为它差不多完成了,我只是不知道怎么说“给我只有匹配的东西”。最后的东西是“东西”三个长字符串“。我清楚了吗? :)

3 个答案:

答案 0 :(得分:1)

根据您的示例,表达式的大部分内容不应与问号,片段哈希或双引号匹配:

"([^?#"]*)\.[a-z]{3,4}"

最后一部分是强制扩展一个3到4个字符,前面加一个句号。

修改

捕获双引号之间的部分:

"(([^?#"]*)\.[a-z]{3,4})"

不确定如何避免使用ASP在基本名称上捕获内存,在PCRE中你会使用?:

答案 1 :(得分:0)

您真的不想尝试自己解析网址。存在可以引用资源的各种格式。您可以src=foo没有引号,src='foo'src="foo",您可以包含自己引用其他资源的样式表,您需要进行实体解码(src='f&quot;oo')和URL编码(src='f o o'),以及处理相对URL和绝对URL(您知道src='//somesite.com/blah'src='http://somesite.com/blah'src='somesite.com/blah'不同吗?)等等。还有你提到的问题,可能还有更多我没有想过的问题。 StackOverflow上已经有很多问题,为什么尝试使用RegEx解析HTML是个坏主意,答案范围从the serioushumorous

相反,为什么不使用已经解决问题的现有工具,例如wget?请参阅wget的recursive download支持,以关注链接并抓取网站以获取引用的资源。

答案 2 :(得分:0)

这样的事情应该有效:

<a href=\"(.*\.[a-z0-9]{3})\"

但是如果确实如此,你必须向我保证,当你后悔为此使用正则表达式时,你会回来发表评论。