Какое регулярное выражение хорошо для извлечения URL-адресов из HTML? - PullRequest
2 голосов
/ 12 ноября 2011

Я попытался использовать свои собственные и использовать верхние значения здесь, в 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 ]

3 голосов
/ 12 ноября 2011

Самое безопасное регулярное выражение - вообще не использовать регулярное выражение и использовать класс System.Uri.

System.Uri

Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
0 голосов
/ 12 ноября 2011

Попробуйте это:

    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);
    }
0 голосов
/ 12 ноября 2011

Вашему регулярному выражению требуется экранирование для тире "-" в последней группе символов:

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

По сути, вы разрешали символы от + до =, включая <</p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...