【问题标题】:Reg Exp to extract all files from HTML正则表达式从 HTML 中提取所有文件
【发布时间】:2012-10-02 22:18:37
【问题描述】:

使用正则表达式我想提取包含在某些 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”一个三个字符长的字符串”。我清楚了吗? :)

【问题讨论】:

  • 我知道 RegExp 不是完美的解决方案,但在这种情况下,它与 HTML 无关。我自己编写 HTML,我知道会有 src="../files/image.jpg" 或 href="../files/document.pdf" 这就是我想要提取的链接类型,很简单英语表达式将是:在 src= 或 href= 之后给我那些以点和三个字母结尾的链接(我对文件的定义),忽略其他所有内容:) 我可以完成其中的一部分,我错过了“结束于. 和三个字母”,因为缺乏 RegExp 知识
  • 你读过链接的答案吗?????
  • 是的,我已经阅读了从 Fermat 参考到 HTML Agility Pack 的所有内容(我拒绝链接到我的项目,因为我知道适当的正则表达式可以完成这项工作)。当我说这不是“狂野”的 HTML 而是我自己编写的代码,没有奇怪的字符和有趣的符号时,你有没有读过这部分 :) 再次,我可以捕获 href= 或 src= 引号之间的文本,所有我想要只保留以点和三个字母结尾的文件,即(在我自己控制的 html-not-in-the-wild-world 中)一个文件。
  • 看,这里的问题是你在自相矛盾。如果使用正则表达式很容易做你想做的事,那你为什么要寻求帮助?

标签: regex extract


【解决方案1】:

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

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

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

编辑

捕捉双引号之间的部分:

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

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

【讨论】:

  • 杰克,我在你的答案中使用了可选的 3,4 个字符,所以你帮我找到了正确的答案,我需要使用 a-z0-9,因为有些文件名为“document20121002” .pdf”并避免?和 # 是不需要的,因为 URL 分为三种:指向某个地方的链接、锚点或带有扩展名的文件。感谢您的帮助!
  • @remoto 如果这个答案有用,请考虑投票,我认为你有足够的代表
【解决方案2】:

这样的事情应该可以工作:

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

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

【讨论】:

  • 承诺! :) 太好了,快到了!但它不适用于 href="domain.com/1.htm" 所以我对文件的定义必须更改为“以点和 3 或 4 个字符(忘记 .xlsx)结尾,除了 .html .aspx .p​​hp”
  • 承诺并交付,实际上。这样做是没有理智的,好吗?只需捕获扩展并在代码中进行测试。
  • 使用你的答案和杰克的答案,我终于得到了答案:href=\"(.*\.(?:(?:[a-z0-9]{3,4}) (?
  • @Remoto 确保在失败时回来并道歉。
【解决方案3】:

您真的不想尝试自己解析 URL。有各种格式可以引用资源。您可以拥有不带引号的src=foosrc='foo'src="foo",您可以包含本身引用其他资源的样式表,您需要进行实体解码 (src='f&amp;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 支持以跟踪链接并抓取站点以获取参考资源。

【讨论】:

  • 谢谢你的建议布赖恩,但我可以完全控制被“解析”的 HTML,那是因为我写了它:) 所以我确定不会有奇怪的字符或 '\\ ',我必须将这个“神奇”的正则表达式放入我编写的用于更新网站内容的 VB 表单应用程序中。因此,尽管看起来很简单,但我无法制作正确的正则表达式来获取给定 HTML 文本中任何 src 和 href 引用的所有文件:)
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2010-09-15
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多