正则表达式或其他从 HTML 中提取完整 URL + 相对 URL 的方法
Regex or another way to extract full URLs + relative URLs from HTML
所以我有一个 SharePoint 网站,我有一些用户将新项目提交到 SharePoint 列表中。列表项中的某些字段包含引用文件或图像的 URL,例如"http://host/abc.jpg"
或 "/abc.jpg"
。
在另一个字段中,用户编辑 HTML 代码,其中可能包含任何标签,例如 <a href="/abc.jpg">
、<img src="/abc.jpg">
等。
我的目标 是找到包含 links/URLs 的字段,并提取那些指向具有文件名加扩展名的内容的 URL。我可以使用以下两个正则表达式从可能包含一些不相关信息或 URL(以及仅 URL)的 SharePoint 字段中提取它:
//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 代码中提取 URLs(相对和完整 URLs)。
假设这是用户的输入,我需要从 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)"
就足够了吗?有什么我可能会错过的吗?
试试这个正则表达式
(?<=(href="|src="))[/]*(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*(?:/(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*)*
只需将任何其他有效标签添加到 (href="|src=")
中的列表
您的正则表达式不应在开头包含 ^ 并在结尾包含 $。它是锚。参见:https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx.
同样使用Matches方法获取所有匹配项。
所以我有一个 SharePoint 网站,我有一些用户将新项目提交到 SharePoint 列表中。列表项中的某些字段包含引用文件或图像的 URL,例如"http://host/abc.jpg"
或 "/abc.jpg"
。
在另一个字段中,用户编辑 HTML 代码,其中可能包含任何标签,例如 <a href="/abc.jpg">
、<img src="/abc.jpg">
等。
我的目标 是找到包含 links/URLs 的字段,并提取那些指向具有文件名加扩展名的内容的 URL。我可以使用以下两个正则表达式从可能包含一些不相关信息或 URL(以及仅 URL)的 SharePoint 字段中提取它:
//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 代码中提取 URLs(相对和完整 URLs)。
假设这是用户的输入,我需要从 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)"
就足够了吗?有什么我可能会错过的吗?
试试这个正则表达式
(?<=(href="|src="))[/]*(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*(?:/(?:[A-Za-z0-9-._~!$&'()*+,;=:@]|%[0-9a-fA-F]{2})*)*
只需将任何其他有效标签添加到 (href="|src=")
中的列表您的正则表达式不应在开头包含 ^ 并在结尾包含 $。它是锚。参见:https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx.
同样使用Matches方法获取所有匹配项。