Как проверить URL-адрес на iPhone

90

В приложении для iPhone, которое я разрабатываю, есть настройка, в которой вы можете ввести URL-адрес, поскольку из-за формы и функции этот URL-адрес должен быть подтвержден как онлайн, так и офлайн.

Пока мне не удалось найти какой-либо метод для проверки URL-адреса, поэтому вопрос:

Как проверить ввод URL-адреса на iPhone (Objective-C) как в режиме онлайн, так и в автономном режиме?

Thizzer
источник
Прочтите комментарии к его ответу, проверка работает некорректно.
Thizzer

Ответы:

98

Благодаря этому посту вы можете избежать использования RegexKit. Вот мое решение (работает для разработки iphone с iOS> 3.0):

- (BOOL) validateUrl: (NSString *) candidate {
    NSString *urlRegEx =
    @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx]; 
    return [urlTest evaluateWithObject:candidate];
}

Если вы хотите проверить в Swift мое решение, приведенное ниже:

 func isValidUrl(url: String) -> Bool {
        let urlRegEx = "^(https?://)?(www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6}(/[-\\w@\\+\\.~#\\?&/=%]*)?$"
        let urlTest = NSPredicate(format:"SELF MATCHES %@", urlRegEx)
        let result = urlTest.evaluate(with: url)
        return result
    }
лефакир
источник
7
Это работает только для URL-адресов типа " webr.ly ". Не работает для URL-адресов с такими параметрами, как youtube.com/watch?v=mqgExtdNMBk
THE uSeFuL
5
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+". Это должно сделать http: // или https: // опционально.
Yeung
не работает для google.com, www.google.com, а также для //www.google.com
Revinder
следующие URL-адреса не работают в моем случае. money.cnn.com/2015/10/19/technology/apple-app-store/…
DJtiwari
@DJtiwari +1 да, это не работает, вы нашли исправление для этого?
Hamza MHIRA
239

Почему бы вместо этого просто не положиться Foundation.framework?

Это делает свою работу и не требует RegexKit:

NSURL *candidateURL = [NSURL URLWithString:candidate];
// WARNING > "test" is an URL according to RFCs, being just a path
// so you still should check scheme and all other NSURL attributes you need
if (candidateURL && candidateURL.scheme && candidateURL.host) {
  // candidate is a well-formed url with:
  //  - a scheme (like http://)
  //  - a host (like stackoverflow.com)
}

Согласно документации Apple:

URLWithString: создает и возвращает объект NSURL, инициализированный предоставленной строкой.

+ (id)URLWithString:(NSString *)URLString

Параметры

URLString: Строка, с помощью которой инициализируется объект NSURL. Должен соответствовать RFC 2396. Этот метод анализирует URLString в соответствии с RFC 1738 и 1808.

Возвращаемое значение

Объект NSURL, инициализированный с помощью URLString. Если строка была искажена, возвращается ноль.

Винсент Гуэрчи
источник
1
Я согласен с некоторыми другими здесь. Это гораздо лучшее решение, чем возиться с регулярными выражениями. Это должен быть правильно проверенный ответ.
Диего Баррос
1
@MrThys - Есть ли шанс, что вы могли бы привести примеры того, какие искаженные URL-адреса не обнаруживаются? Было бы здорово узнать ... пока что кажется отличным решением.
Дон Вон
7
@DonamiteIsTnt URL-адрес http://www.aol.comhttp://www.nytimes.comпроходит этот тест.
Аарон Брагер,
1
Код не будет проверять неправильный формат URL. Пример: <code> afasd </ code >, URL-адрес все равно пройдет проверку
denil 09
39
Документы неверны. Напишите несколько тестов - NSURLне возвращает nil, когда я передаю строку @ "# @ # @ $ ##% $ # $ #" или @ "tp: / fdfdfsfdsf". Таким образом, этот метод будет бесполезен для проверки действительных URL-адресов HTTP и т.п.
Тони Арнольд
32

Вместо того, чтобы писать свои собственные регулярные выражения, положитесь на Apple. Я использовал категорию, NSStringкоторая используется NSDataDetectorдля проверки наличия ссылки в строке. Если диапазон ссылки, найденной с помощью, NSDataDetectorравен длине всей строки, то это действительный URL.

- (BOOL)isValidURL {
    NSUInteger length = [self length];
    // Empty strings should return NO
    if (length > 0) {
        NSError *error = nil;
        NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
        if (dataDetector && !error) {
            NSRange range = NSMakeRange(0, length);
            NSRange notFoundRange = (NSRange){NSNotFound, 0};
            NSRange linkRange = [dataDetector rangeOfFirstMatchInString:self options:0 range:range];
            if (!NSEqualRanges(notFoundRange, linkRange) && NSEqualRanges(range, linkRange)) {
                return YES;
            }
        }
        else {
            NSLog(@"Could not create link data detector: %@ %@", [error localizedDescription], [error userInfo]);
        }
    }
    return NO;
}
Энтони
источник
Очень умно. Настоящая инженерия. {Вы знаете, у меня была странная проблема: если я отправлю ему строку буквально «<null>», она вылетит! Никогда не мог понять.}
Fattie
Ах, это было "<null>" в сыне, которое Apple предоставляет как NSNull! : O
Fattie
Я создал суть, в которой начал добавлять тестовые примеры для этого фрагмента. Заполните бесплатно, чтобы добавить больше. gist.github.com/b35097bad451c59e23b1.git
Евгений Дубинин
26

Мое решение со Swift :

func validateUrl (stringURL : NSString) -> Bool {

    var urlRegEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
    let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[urlRegEx])
    var urlTest = NSPredicate.predicateWithSubstitutionVariables(predicate)

    return predicate.evaluateWithObject(stringURL)
}

Для теста:

var boolean1 = validateUrl("http.s://www.gmail.com")
var boolean2 = validateUrl("https:.//gmailcom")
var boolean3 = validateUrl("https://gmail.me.")
var boolean4 = validateUrl("https://www.gmail.me.com.com.com.com")
var boolean6 = validateUrl("http:/./ww-w.wowone.com")
var boolean7 = validateUrl("http://.www.wowone")
var boolean8 = validateUrl("http://www.wow-one.com")
var boolean9 = validateUrl("http://www.wow_one.com")
var boolean10 = validateUrl("http://.")
var boolean11 = validateUrl("http://")
var boolean12 = validateUrl("http://k")

Полученные результаты:

false
false
false
true
false
false
true
true
false
false
false
Габриэль Массана
источник
10

использовать это-

NSString *urlRegEx = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&amp;=]*)?";
Вайбхав Саран
источник
1
я скопировал его просто для валидатора регулярных выражений asp.net;)
Вайбхав Саран 01
идеально, единственная проблема в том, что он не распознаетwww.google.com/+gplusname
Мухаммад
5

Я решил проблему с помощью RegexKit и создал быстрое регулярное выражение для проверки URL-адреса;

NSString *regexString = @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
NSString *subjectString = brandLink.text;
NSString *matchedString = [subjectString stringByMatching:regexString];

Затем я проверяю, совпадает ли matchedString с subjectString, и если это так, URL-адрес действителен :)

Поправьте меня, если мое регулярное выражение неверно;)

Thizzer
источник
Возможно, я ошибаюсь, но я считаю, что регулярное выражение не проверяет URL-адреса со строками запроса или именованными якорями.
hpique
Вы можете сделать часть префикса необязательной, заменив (http | https): // на ((http | https): //) *, но это позволит использовать очень широкий спектр URL-адресов
Thizzer
4

Как ни странно, я действительно не нашел здесь решения, которое было бы очень простым, но все же хорошо справлялось с обработкой http/ httpsссылками.

Имейте в виду, ЭТО НЕ идеальное решение, но оно работало в приведенных ниже случаях. Таким образом, регулярное выражение проверяет, начинается ли URL с символа http://или https://, затем проверяет наличие хотя бы 1 символа, затем проверяет наличие точки, а затем снова проверяет наличие хотя бы 1 символа. Пробелы не допускаются.

+ (BOOL)validateLink:(NSString *)link
{
    NSString *regex = @"(?i)(http|https)(:\\/\\/)([^ .]+)(\\.)([^ \n]+)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [predicate evaluateWithObject:link];
}

Протестировано ДЕЙСТВИТЕЛЬНО для этих URL:

@"HTTP://FOO.COM",
@"HTTPS://FOO.COM",
@"http://foo.com/blah_blah",
@"http://foo.com/blah_blah/",
@"http://foo.com/blah_blah_(wikipedia)",
@"http://foo.com/blah_blah_(wikipedia)_(again)",
@"http://www.example.com/wpstyle/?p=364",
@"https://www.example.com/foo/?bar=baz&inga=42&quux",
@"http://✪df.ws/123",
@"http://userid:password@example.com:8080",
@"http://userid:password@example.com:8080/",
@"http://userid@example.com",
@"http://userid@example.com/",
@"http://userid@example.com:8080",
@"http://userid@example.com:8080/",
@"http://userid:password@example.com",
@"http://userid:password@example.com/",
@"http://142.42.1.1/",
@"http://142.42.1.1:8080/",
@"http://➡.ws/䨹",
@"http://⌘.ws",
@"http://⌘.ws/",
@"http://foo.com/blah_(wikipedia)#cite-",
@"http://foo.com/blah_(wikipedia)_blah#cite-",
@"http://foo.com/unicode_(✪)_in_parens",
@"http://foo.com/(something)?after=parens",
@"http://☺.damowmow.com/",
@"http://code.google.com/events/#&product=browser",
@"http://j.mp",
@"http://foo.bar/?q=Test%20URL-encoded%20stuff",
@"http://مثال.إختبار",
@"http://例子.测试",
@"http://उदाहरण.परीक्षा",
@"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
@"http://1337.net",
@"http://a.b-c.de",
@"http://223.255.255.254"

Протестировано НЕДЕЙСТВИТЕЛЬНО для этих URL:

@"",
@"foo",
@"ftp://foo.com",
@"ftp://foo.com",
@"http://..",
@"http://..",
@"http://../",
@"//",
@"///",
@"http://##/",
@"http://.www.foo.bar./",
@"rdar://1234",
@"http://foo.bar?q=Spaces should be encoded",
@"http:// shouldfail.com",
@":// should fail"

Источник URL: https://mathiasbynens.be/demo/url-regex

Кгаидис
источник
3

Вы можете использовать это , если вы не хотите httpили httpsилиwww

NSString *urlRegEx = @"^(http(s)?://)?((www)?\.)?[\w]+\.[\w]+";

пример

- (void) testUrl:(NSString *)urlString{
    NSLog(@"%@: %@", ([self isValidUrl:urlString] ? @"VALID" : @"INVALID"), urlString);
}

- (void)doTestUrls{
    [self testUrl:@"google"];
    [self testUrl:@"google.de"];
    [self testUrl:@"www.google.de"];
    [self testUrl:@"http://www.google.de"];
    [self testUrl:@"http://google.de"];
}

Выход:

INVALID: google
VALID: google.de
VALID: www.google.de
VALID: http://www.google.de
VALID: http://google.de
Hiren
источник
Это кажется очень интересным. Это 100% пуленепробиваемое изделие?
Supertecnoboff
3

У решения Lefakir есть одна проблема. Его регулярное выражение не может совпадать с " http://instagram.com/p/4Mz3dTJ-ra/ ". Компонент url имеет комбинированный числовой и буквальный характер. Его регулярное выражение не поддерживает такие URL-адреса.

Вот мое улучшение.

"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*)+)+(/)?(\\?.*)?"
покров
источник
2

Я нашел самый простой способ сделать это так:

- (BOOL)validateUrl: (NSURL *)candidate
{
    NSURLRequest *req = [NSURLRequest requestWithURL:candidate];
    return [NSURLConnection canHandleRequest:req];
}
Julianwyz
источник
Я использую его уже некоторое время, и, похоже, он работает нормально. Также кажется, что это хорошо сочетается с новыми TLD ( namecheap.com/domains/new-tlds/explore.aspx ).
julianwyz
Это бессмысленно. Если ваш URL-адрес является недопустимой строкой, он выйдет из строя при создании NSURL, так что вместо этого можно проверить. И даже в этом случае он использует старый API.
Legoless 05
@Legoless может просто попробовать ... уловить это?
COBB
2

Код ниже позволит вам найти действительные URL-адреса

      NSPredicate *websitePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"^(((((h|H)(t|T){2}(p|P)s?)|((f|F)(t|T)(p|P)))://(w{3}.)?)|(w{3}.))[A-Za-z0-9]+(.[A-Za-z0-9-:;\?#_]+)+"];
     if ([websitePredicate evaluateWithObject:##MY_STRING##])
     {
       printf"Valid"
     }

для таких URL

Раджеш
источник
1

Утвержденный ответ неверен. У меня есть URL-адрес со знаком «-», и проверка не выполняется.

Leander
источник
1

Откорректировал ответ Вайбхава для поддержки ссылок G +:

NSString *urlRegEx = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-\\+ ./?%&amp;=]*)?";

МухаммадБассио
источник
1

Некоторые URL-адреса без / в конце не определяются как правильные в приведенных выше решениях. Так что это может быть полезно.

  extension String {
    func isValidURL() -> Bool{
        let length:Int = self.characters.count
        var err:NSError?
        var dataDetector:NSDataDetector? = NSDataDetector()
        do{
            dataDetector = try NSDataDetector(types: NSTextCheckingType.Link.rawValue)
        }catch{
            err = error as NSError
        }
        if dataDetector != nil{
            let range = NSMakeRange(0, length)
            let notFoundRange = NSRange(location: NSNotFound, length: 0)
            let linkRange = dataDetector?.rangeOfFirstMatchInString(self, options: NSMatchingOptions.init(rawValue: 0), range: range)
            if !NSEqualRanges(notFoundRange, linkRange!) && NSEqualRanges(range, linkRange!){
                return true
            }
        }else{
            print("Could not create link data detector: \(err?.localizedDescription): \(err?.userInfo)")
        }

        return false
    }
}
Pratik Mistry
источник
1

Проверка URL в Swift

Детали

Xcode 8.2.1, Swift 3

Код

enum URLSchemes: String

import Foundation

enum URLSchemes: String {
    case http = "http://", https = "https://", ftp = "ftp://", unknown = "unknown://"

    static func detectScheme(urlString: String) -> URLSchemes {

        if URLSchemes.isSchemeCorrect(urlString: urlString, scheme: .http) {
            return .http
        }
        if URLSchemes.isSchemeCorrect(urlString: urlString, scheme: .https) {
            return .https
        }
        if URLSchemes.isSchemeCorrect(urlString: urlString, scheme: .ftp) {
            return .ftp
        }
        return .unknown
    }

    static func getAllSchemes(separetedBy separator: String) -> String {
        return "\(URLSchemes.http.rawValue)\(separator)\(URLSchemes.https.rawValue)\(separator)\(URLSchemes.ftp.rawValue)"
    }

    private static func isSchemeCorrect(urlString: String, scheme: URLSchemes) -> Bool {
        if urlString.replacingOccurrences(of: scheme.rawValue, with: "") == urlString {
            return false
        }
        return true
    }
}

строка расширения

import Foundation

extension String {

    var isUrl: Bool {

        // for http://regexr.com checking
        // (?:(?:https?|ftp):\/\/)(?:xn--)?(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[#-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?

        let schemes = URLSchemes.getAllSchemes(separetedBy: "|").replacingOccurrences(of: "://", with: "")
        let regex = "(?:(?:\(schemes)):\\/\\/)(?:xn--)?(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[#-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?"


        let regularExpression = try! NSRegularExpression(pattern: regex, options: [])
        let range = NSRange(location: 0, length: self.characters.count)
        let matches = regularExpression.matches(in: self, options: [], range: range)
        for match in matches {
            if range.location == match.range.location && range.length == match.range.length {
                return true
            }
        }
        return false
    }

    var toURL: URL? {

        let urlChecker: (String)->(URL?) = { url_string in
            if url_string.isUrl, let url = URL(string: url_string) {
                return url
            }
            return nil
        }

        if !contains(".") {
            return nil
        }

        if let url = urlChecker(self) {
            return url
        }

        let scheme = URLSchemes.detectScheme(urlString: self)
        if scheme == .unknown {
            let newEncodedString = URLSchemes.http.rawValue + self
            if let url = urlChecker(newEncodedString) {
                return url
            }
        }

        return nil
    }
}

Применение

 func tests() {

    chekUrl(urlString:"http://example.com")
    chekUrl(urlString:"https://example.com")
    chekUrl(urlString:"http://example.com/dir/file.php?var=moo")
    chekUrl(urlString:"http://xn--h1aehhjhg.xn--d1acj3b")
    chekUrl(urlString:"http://www.example.com/wpstyle/?p=364")
    chekUrl(urlString:"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com")
    chekUrl(urlString:"http://example.com")
    chekUrl(urlString:"http://xn--d1acpjx3f.xn--p1ai")
    chekUrl(urlString:"http://xn--74h.damowmow.com/")
    chekUrl(urlString:"ftp://example.com:129/myfiles")
    chekUrl(urlString:"ftp://user:pass@site.com:21/file/dir")
    chekUrl(urlString:"ftp://ftp.example.com:2828/asdah%20asdah.gif")
    chekUrl(urlString:"http://142.42.1.1:8080/")
    chekUrl(urlString:"http://142.42.1.1/")
    chekUrl(urlString:"http://userid:password@example.com:8080")
    chekUrl(urlString:"http://userid@example.com")
    chekUrl(urlString:"http://userid@example.com:8080")
    chekUrl(urlString:"http://foo.com/blah_(wikipedia)#cite-1")
    chekUrl(urlString:"http://foo.com/(something)?after=parens")

    print("\n----------------------------------------------\n")

    chekUrl(urlString:".")
    chekUrl(urlString:" ")
    chekUrl(urlString:"")
    chekUrl(urlString:"-/:;()₽&@.,?!'{}[];'<>+_)(*#^%$")
    chekUrl(urlString:"localhost")
    chekUrl(urlString:"yandex.")
    chekUrl(urlString:"коряга")
    chekUrl(urlString:"http:///a")
    chekUrl(urlString:"ftps://foo.bar/")
    chekUrl(urlString:"rdar://1234")
    chekUrl(urlString:"h://test")
    chekUrl(urlString:":// should fail")
    chekUrl(urlString:"http://-error-.invalid/")
    chekUrl(urlString:"http://.www.example.com/")
}

func chekUrl(urlString: String) {
    var result = ""
    if urlString.isUrl {
        result += "url: "
    } else {
        result += "not url: "
    }
    result += "\"\(urlString)\""
    print(result)
}

Результат

введите описание изображения здесь

Василий Боднарчук
источник
1

Цель C

- (BOOL)validateUrlString:(NSString*)urlString
{
    if (!urlString)
    {
        return NO;
    }

    NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];

    NSRange urlStringRange = NSMakeRange(0, [urlString length]);
    NSMatchingOptions matchingOptions = 0;

    if (1 != [linkDetector numberOfMatchesInString:urlString options:matchingOptions range:urlStringRange])
    {
        return NO;
    }

    NSTextCheckingResult *checkingResult = [linkDetector firstMatchInString:urlString options:matchingOptions range:urlStringRange];

    return checkingResult.resultType == NSTextCheckingTypeLink && NSEqualRanges(checkingResult.range, urlStringRange);
}

Надеюсь это поможет!

Дхармеш Мансата
источник
0

Вы хотели проверить, является ли введенный пользователем URL-адресом? Это может быть так же просто, как регулярное выражение, например проверка, содержит ли строка www.(это способ, которым Yahoo messenger проверяет, является ли статус пользователя ссылкой или нет).
Надеюсь, что это поможет.

Phunehehe
источник
0

Эгоистично, я бы предложил использовать KSURLFormatterэкземпляр как для проверки ввода, так и для преобразования его во что-то, с чем NSURLможно справиться.

Майк Абдулла
источник
Есть ли это для iOS?
capikaw
Он должен нормально работать на iOS. Если это не так, исправьте это и отправьте мне запрос
Майк Абдулла
0

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

http://dhawaldawar.wordpress.com/2014/06/11/uitextfield-validation-ios/

Дхавал Давар
источник
0

Расширяя ответ @Anthony на swift, я написал категорию, в Stringкоторой возвращается необязательный NSURL. Возвращаемое значение - nilесли Stringне может быть подтверждено, что это URL.

import Foundation

// A private global detector variable which can be reused.
private let detector = try! NSDataDetector(types: NSTextCheckingType.Link.rawValue)

extension String {
  func URL() -> NSURL? {
    let textRange = NSMakeRange(0, self.characters.count)
    guard let URLResult = detector.firstMatchInString(self, options: [], range: textRange) else {
      return nil
    }

    // This checks that the whole string is the detected URL. In case
    // you don't have such a requirement, you can remove this code
    // and return the URL from URLResult.
    guard NSEqualRanges(URLResult.range, textRange) else {
      return nil
    }

    return NSURL(string: self)
  }
}
Аюш Гоэль
источник
0
func checkValidUrl(_ strUrl: String) -> Bool {
    let urlRegEx: String = "(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
    let urlTest = NSPredicate(format: "SELF MATCHES %@", urlRegEx)
    return urlTest.evaluate(with: strUrl)
}
Урвиш Моди
источник
0

Мое решение в Swift 5:

extension String {
    func isValidUrl() -> Bool {
        do {
            let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
            // check if the string has link inside
            return detector.numberOfMatches(in: self, options: [], range: .init( location: 0, length: utf16.count)) > 0
        } catch {
            print("Error during NSDatadetector initialization \(error)" )
        }
        return false
    }
}
Назарий Влизло
источник