0

假设我的字符串是

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 提取它们不是一个可行的选择。

4

3 回答 3

3

在其他答案和评论中,我实际上可以实现的最简单的方法是拆分方式。你知道这里有很多盲目的猜测,最好的选择之一可能是:

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;
}
于 2012-07-28T22:30:32.543 回答
0

由于“:”不是 URL 中的有效字符,因此可以假设当您搜索“http://”时,您将获得一个良好、有效的 URL 开头。

搜索这个并找到你的开始。

您可以构建您可能遇到的已知良好 TLD 的列表(这将有所帮助:http ://en.wikipedia.org/wiki/List_of_Internet_top-level_domains )

你知道这将是你的终点;所以你可以从字符串的开头搜索这些。

从头开始,从这个索引开始。跳过后面的所有内容,这不好。

我假设您没有子目录;因为你没有列出任何一个。

于 2012-07-28T22:04:49.663 回答
0

您可以通过搜索和拆分“http://”来使用此问题中的字符串拆分逻辑。如果您确实需要“http://”部分,您可以随时添加它。

编辑:请注意,之后您必须在每个 URL 的末尾搜索和过滤(例如?) \r\n ,但这应该不是一个大问题......

于 2012-07-28T22:05:16.120 回答