假设我的字符串是
http://www.test.com\r\nhttp://www.hello.com<some text here>http://www.world.com
我想提取字符串中的所有 URL。输出应如下所示:
http://www.test.com
http://www.hello.com
http://www.world.com
我怎样才能做到这一点?
字符串中没有 html 标记,因此使用 HTMLAgilityPack 提取它们不是一个可行的选择。
在其他答案和评论中,我实际上可以实现的最简单的方法是拆分方式。你知道这里有很多盲目的猜测,最好的选择之一可能是:
using System.Text.RegularExpressions;
public static List<string> ParseUrls(string input) {
List<string> urls = new List<string>();
const string pattern = "http://"; //here you may use a better expression to include ftp and so on
string[] m = Regex.Split(input, pattern);
for (int i = 0; i < m.Length; i++)
if (i % 2 == 0){
Match urlMatch = Regex.Match(m[i],"^(?<url>[a-zA-Z0-9/?=&.]+)", RegexOptions.Singleline);
if(urlMatch.Success)
urls.Add(string.Format("http://{0}", urlMatch.Groups["url"].Value)); //modify the prefix according to the chosen pattern
}
return urls;
}
由于“:”不是 URL 中的有效字符,因此可以假设当您搜索“http://”时,您将获得一个良好、有效的 URL 开头。
搜索这个并找到你的开始。
您可以构建您可能遇到的已知良好 TLD 的列表(这将有所帮助:http ://en.wikipedia.org/wiki/List_of_Internet_top-level_domains )
你知道这将是你的终点;所以你可以从字符串的开头搜索这些。
从头开始,从这个索引开始。跳过后面的所有内容,这不好。
我假设您没有子目录;因为你没有列出任何一个。
您可以通过搜索和拆分“http://”来使用此问题中的字符串拆分逻辑。如果您确实需要“http://”部分,您可以随时添加它。
编辑:请注意,之后您必须在每个 URL 的末尾搜索和过滤(例如?) \r\n ,但这应该不是一个大问题......