Улучшение функции проверки URL - PullRequest
2 голосов
/ 20 декабря 2011

Я использую эту функцию, чтобы проверить, является ли URL действительным или нет.это работает в большинстве случаев, но здесь следующий URL, который он возвращает, который не является действительным!регулярное выражение моей функции, которое будет охватывать все типы URL?

- (BOOL) urlIsValiad: (NSString *) url 
{
    NSString *regex = 
    @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    if ([regextest evaluateWithObject: url] == YES) {
        NSLog(@"URL is valid!");
    } else {
        NSLog(@"URL is not valid!");
    }

    return [regextest evaluateWithObject:url];
}

Ответы [ 5 ]

2 голосов
/ 20 декабря 2011

Это будет моя попытка:

((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?

РЕДАКТИРОВАТЬ Добавлено в обратной ссылке (?<=/) для дополнительной специфичности

РЕДАКТИРОВАТЬ 2 Добавлен дополнительный поиск страныимя в URL (например, www.google.com.in)

1 голос
/ 20 декабря 2011

Попробуйте изменить строку * regex = следующим образом.

NSString * regex = "(http | ftp | https): // [\ w-_] + (. [\ W-_] +) + ([\ w -., @? ^ = % &: / ~ + #] * [\ w - \ @? ^ =% & / ~ + #])? "

0 голосов
/ 04 января 2018
-(BOOL)validateUrl{
//    NSString *urlRegEx =  @"((?:http|https)://)?(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
    NSString *urlRegEx =  @"((?:http|https)://)?(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
    if ([urlTest evaluateWithObject: self] == YES) {
        NSLog(@"URL is valid!");
    } else {
        NSLog(@"URL is not valid!");
    }
    return [urlTest evaluateWithObject:self];
}
0 голосов
/ 23 ноября 2015

Старая тема, но я думаю, что мои поправки могут быть полезны для кого-то еще, приземляющегося здесь:

Я не хотел проверять только «www» в качестве имени хоста, в настоящее время мы можем встретить разные имена хостов ... Таким образом, я расширил Regex с помощью:

"((?:http|https)://)?(?:[A-Za-z0-9]{1,25}\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"
0 голосов
/ 14 марта 2012

Ну, я нашел что-то на сайте Microsoft, и с небольшими изменениями это лучшее выражение на данный момент:

@"(?:[A-Za-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%\\&'*+/=?\\^_`{|}"

@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"

@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-"

@"z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\\[(?:(?:25[0-5"

@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"

@"9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"

@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
...