什么正则表达式适合从HTML中提取URL?

时间:2011-11-12 04:54:33

标签: c# regex url

我已尝试使用自己的,并在StackOverflow上使用顶部的,但大多数匹配的次数超出了预期。

例如,有些人会从输入http://foo.com/hello?world<br中提取<br(注释...http://foo.com/hello?world<br>...)。

如果有一种模式可以更可靠地匹配URL吗?

这是我正在使用的当前模式:

@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&^]*)"

3 个答案:

答案 0 :(得分:3)

最安全的正则表达式是完全不使用正则表达式并使用System.Uri类。

System.Uri

Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);

答案 1 :(得分:0)

你的正则表达式需要在最后一个字符组中使用短划线“ - ”:

@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+\-=\\\.&^]*)"

基本上,你允许使用+到=的字符,其中包括&lt;

答案 2 :(得分:0)

试试这个:

    public static string[] Parse(string pattern, string groupName, string input)
    {
        var list = new List<string>();

        var regex = new Regex(pattern, RegexOptions.IgnoreCase);
        for (var match = regex.Match(input); match.Success; match = match.NextMatch())
        {
            list.Add(string.IsNullOrWhiteSpace(groupName) ? match.Value : match.Groups[groupName].Value);
        }

        return list.ToArray();
    }

    public static string[] ParseUri(string input)
    {
        const string pattern = @"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*";

        return Parse(pattern, string.Empty, input);
    }