Regex Reg Exp从HTML中提取所有文件

Regex Reg Exp从HTML中提取所有文件,regex,extract,Regex,Extract,使用正则表达式,我想提取一些HTML文本中包含的文件或图像的所有链接。尝试了几个示例,但由于许多原因失败(主要原因是我不擅长正则表达式:) 1) 首先我试过这个: > Regex("<img[^>]+src=[""']([^""']+)[""']", RegexOptions.Singleline Or > RegexOptions.IgnoreCase) 1) 提取所有图像,工作正常,但这只是部分解决方案。 2) 提取所有href=“asdf”,但我只想提取指向文件的

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

1) 首先我试过这个:

> Regex("<img[^>]+src=[""']([^""']+)[""']", RegexOptions.Singleline Or
> RegexOptions.IgnoreCase)
1) 提取所有图像,工作正常,但这只是部分解决方案。 2) 提取所有href=“asdf”,但我只想提取指向文件的href,我不想要锚(#middlesection)或.aspx,甚至是没有扩展名的url,如href=“www.google.com/site”

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

我对“.aspx”或“.html”不感兴趣,对“id_content=99”这样的无扩展URL也不感兴趣,对“#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是由我手工编写的(说来话长),因此不会出现奇怪的双引号、格式错误的标记或奇怪的字符


我知道这是可能的,因为它几乎完成了,我只是不知道如何告诉我“只给我有匹配的”。最后的“某物”是“某物”一个三个字符长的字符串。我明白了吗?:)

您真的不想自己解析URL。有各种各样的格式可以引用资源。您可以使用不带引号的
src=foo
src='foo'
src=“foo”
,您可以包含引用其他资源的样式表,您需要进行实体解码(
src='f“oo'
)和URL编码(
src='f o'
),并处理相对和绝对URL(你知道
src='//somesite.com/blah'
不同于
src='http://somesite.com/blah“
src='somesite.com/blah'
?)诸如此类。还有你提到的问题,可能还有更多我没有想到的问题。关于StackOverflow,已经有很多问题,关于为什么尝试用正则表达式解析HTML是个坏主意,答案从到


相反,为什么不使用已经解决了问题的现有工具,例如?请参阅wget的支持,以跟踪链接并对站点进行爬网以获取引用的资源。

类似的工具应该可以工作:

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

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

"([^?#"]*)\.[a-z]{3,4}"
最后一部分是强制在3到4个字符之间加上句点

编辑

要捕获双引号之间的零件,请执行以下操作:

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

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

我知道RegExp不是完美的解决方案,但在这种情况下,它不是关于“野生”HTML的。我自己编写HTML,我知道会有src=“../files/image.jpg”或href=“../files/document.pdf”“这就是我想提取的链接类型,用简单的英语表达是:在src=或href=之后给我那些以点和三个字母结尾的链接(我对文件的定义)忽略其他内容:)我可以完成部分任务,我缺少了“以.和三个字母结尾”由于缺乏RegExp知识,您是否阅读了链接的答案?????是的,我已经阅读了从Fermat参考到HTML Agility Pack的所有内容(我拒绝链接到我的项目,因为我知道一个合适的regex可以完成这项工作)。我说这不是“野生”HTML,而是我自己编写的代码,没有奇怪的字符和有趣的符号:)再说一遍,我可以捕获href=或src=引号之间的文本,我只想保留以一个点和三个字母结尾的文本,即(在我自己控制的HTML中,而不是在野生世界中)一个文件。参见,这里的问题是你在自相矛盾。如果用正则表达式做你想做的事情很容易,那你为什么要寻求帮助呢?谢谢你的建议Brian,但我完全可以控制HTML被“解析”,这是因为我写的:)所以我知道肯定不会有奇怪的字符或“\\\”,我必须把这个“神奇的”正则表达式放在我为更新网站内容而编写的VB表单应用程序中。因此,看起来很简单,我无法使用正确的regexp来获取给定HTML文本中任何src和href引用的所有文件:)承诺!:)太好了,快到了!但它不适用于href=“”,因此我对文件的定义必须更改为“除.html.aspx.php外,以一个点和3或4个字符(忘记了.xlsx)结尾”承诺并实际交付。这样做是不明智的,好吗?只需捕获扩展并在代码中测试它。使用you-answer和Jack的,我最终得到了答案,答案是:href=\“(.*\(?:(?:[a-z0-9]{3,4})(?@remo为了确保在失败时返回并道歉。Jack,我在你的答案中使用了可选的3,4个字符,因此你帮助我找到了正确的答案,我需要使用a-z0-9,因为其中有名为“document20121002.pdf”的文件“避免”和“不”是不需要的,因为URL有三种:一个指向某个地方的链接,一个锚或一个带有扩展名的文件。谢谢你的帮助!@如果这个答案是有用的,那么考虑一下投票吧,我想你已经有了发言权了。
"(([^?#"]*)\.[a-z]{3,4})"