正则表达式或从HTML中提取完整URL +相对URL的其他方法

时间:2016-10-25 19:10:42

标签: c# regex parsing html-parsing

所以我有一个SharePoint网站,我有用户将新项目提交到SharePoint列表中。列表项中的某些字段包含引用文件或图像的URL,例如"http://host/abc.jpg""/abc.jpg"

在其他字段中,用户编辑HTML代码,其中可能包含<a href="/abc.jpg"><img src="/abc.jpg">等任何标记。

我的目标是查找包含链接/网址的字段,并提取指向具有文件名加扩展名的网址的网址。我没有问题从SharePoint字段中提取它,这些字段可能包含一些不相关的信息或使用这两个正则表达式的URL(以及仅限URL):

//this will match full url e.g. http://localhost/path/a.jpg
var fullUrlRegex = 
            new Regex(@"^https?:\/\/(?:.*)[\.]+(?:[a-z0-9]{1,4})$");
//this will match an absolute path like //test/files to upload/222.jpg
var absolutePathRegex =
            new Regex(@"^\/.*[\.]+(?:[a-z0-9]{1,4})$");

var fullUrlRegexMatch = fullUrlRegex.Match(value);
var absolutePathRegexMatch = absolutePathRegex.Match(value);

//now check which one matched and save the value

但是,我不确定如何从用户在其他字段中输入的HTML代码中提取URL(相对URL和完整URL)。

假设这是用户的输入,我需要从该HTML代码中提取指向文件的链接。

<p>This is a <a href="/abc.jpg">picture</a>! 
And this is a pic too: <img src="/abc.jpg"></p>

标签可以是任何内容,不仅限于<a><img>。我认为可以解决这个问题的一种方法是使用HTML Agility Pack,但这似乎有些过分。正则表达式搜索src="(match this)"href="(match this)"是否足够?我可能会错过什么?

2 个答案:

答案 0 :(得分:1)

试试这个正则表达式

(?<=(href="|src="))[/]*(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*(?:/(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*)*

只需将任何其他有效标签添加到列表中(href =&#34; | src =&#34;)

答案 1 :(得分:1)

你的正则表达式不应该包含^的开头和$结尾。这是一个achor。请参阅:https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

还可以使用匹配方法获取所有匹配项。