3

使用正则表达式我想提取包含在某些 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”这样的扩展名的url

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

我对“.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 是我手写的(长篇大论),因此不会出现奇怪的双双引号或格式错误的标签或奇怪的字符。

我知道它可以做到,因为它几乎完成了,我只是不知道如何告诉我“只给我最后有“.something”的匹配项是“something”一个三个字符的长字符串”。我清楚了吗?:)

4

3 回答 3

1

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

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

最后一部分是强制在 3 到 4 个字符之间加上句点。

编辑

要捕获双引号之间的部分:

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

不确定如何避免使用 ASP 对基本名称进行内存捕获,在 PCRE 中您将使用?:

于 2012-10-03T06:17:23.107 回答
0

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

相反,为什么不使用已经解决问题的现有工具,比如wget?请参阅 wget 的递归下载支持以跟踪链接并爬取站点以获取参考资源。

于 2012-10-02T22:43:19.533 回答
0

像这样的东西应该工作:

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

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

于 2012-10-03T03:32:29.653 回答