İPhone'da bir url nasıl doğrulanır


90

Geliştirmekte olduğum bir iPhone uygulamasında, URL girebileceğiniz bir ayar var, çünkü bu URL'nin hem çevrimiçi hem de çevrimdışı olarak doğrulanması gerekiyor.

Şimdiye kadar url'yi doğrulamak için herhangi bir yöntem bulamadım, bu yüzden soru şu;

İPhone'da (Objective-C) bir URL girişini çevrimiçi ve çevrimdışı olarak nasıl doğrularım?


Cevabına verilen yorumları okuyun, doğrulama doğru çalışmıyor.
Thizzer

Yanıtlar:


98

Bu gönderi sayesinde RegexKit'i kullanmaktan kurtulabilirsiniz. İşte benim çözümüm (iOS> 3.0 ile iphone geliştirme için çalışıyor):

- (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'i kontrol etmek isterseniz, aşağıda verilen çözümüm:

 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
Bu yalnızca " webr.ly " türündeki url'ler için çalışır, youtube.com/watch?v=mqgExtdNMBk
ThE uSeFuL

5
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"Http: // veya https: // isteğe bağlı olmalıdır.
Yeung

google.com, www.google.com ve ayrıca //www.google.com
Revinder

benim durumumda aşağıdaki url'ler çalışmıyor. money.cnn.com/2015/10/19/technology/apple-app-store/…
DJtiwari

@DJtiwari +1 evet çalışmıyor bunun için herhangi bir düzeltme buldunuz mu?
Hamza MHIRA

239

Neden bunun yerine güvenmiyorsunuz Foundation.framework?

Bu işi yapar ve RegexKitşunları gerektirmez :

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 belgelerine göre:

URLWithString: Sağlanan bir dizeyle başlatılmış bir NSURL nesnesi oluşturur ve döndürür.

+ (id)URLWithString:(NSString *)URLString

Parametreler

URLString: NSURL nesnesinin başlatılacağı dize. RFC 2396 ile uyumlu olmalıdır. Bu yöntem URLString'i RFC'ler 1738 ve 1808'e göre ayrıştırır.

Geri dönüş değeri

URLString ile başlatılan bir NSURL nesnesi. Dize hatalı biçimlendirildiyse, sıfır döndürür.


1
Buradaki bazılarına katılıyorum. Bu, normal ifadelerle uğraşmaktan çok daha iyi bir çözümdür. Bu doğru kontrol edilmiş cevap olmalıdır.
Diego Barros

1
@MrThys - Bunun yakalanmadığı hatalı biçimlendirilmiş URL'lere örnekler sunma şansınız var mı? Bilmek harika olurdu .. şimdiye kadar mükemmel bir çözüm gibi görünüyor.
uɥƃnɐʌuop

7
@DonamiteIsTnt URL http://www.aol.comhttp://www.nytimes.combu testi geçti.
Aaron Brager

1
Kod, hatalı biçimlendirilmiş url'yi kontrol etmeyecektir. Ör: <code> afasd </ code >, url yine de testi geçecek
denil

39
Dokümanlar yanlış. Birkaç test yazın - NSURL@ "# @ # @ $ ##% $ # $ #" veya @ "tp: / fdfdfsfdsf" dizesini geçtiğimde sıfır döndürmüyor. Dolayısıyla bu yöntem, geçerli HTTP URL'leri ve benzerlerini kontrol etmek için işe yaramaz.
Tony Arnold

32

Kendi normal ifadelerinizi yazmak yerine Apple'ınkine güvenin. Bir dizedeki bir bağlantının varlığını test etmek için kullanan bir kategori NSStringkullanıyorum NSDataDetector. Tarafından bulunan bağlantının aralığı NSDataDetectortüm dizenin uzunluğuna eşitse, bu geçerli bir URL'dir.

- (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;
}

Son derece zeki. Gerçek mühendislik. {Biliyorsun, tuhaf bir sorun yaşadım, eğer ona kelimenin tam anlamıyla "<boş>" yazarsam çöküyor! Asla anlayamadım.}
Şişko

Ah - oğlunun adı "<boş>" idi, elmanın faydalı bir şekilde NSNull olarak sağladığı! : O
Şişko

Bu kesilen için test senaryoları eklemeye başladığım bir özet oluşturdum. Daha fazlasını eklemek için ücretsiz doldurun. gist.github.com/b35097bad451c59e23b1.git
Yevhen Dubinin

26

Swift ile çözümüm :

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)
}

Test için:

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")

Sonuçlar:

false
false
false
true
false
false
true
true
false
false
false

10

bunu kullan-

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

1
basitçe asp.net düzenli ifade doğrulayıcısı için kopyaladım;)
Vaibhav Saran

mükemmel, tek sorun tanımamasıwww.google.com/+gplusname
MuhammadBassio

5

Sorunu RegexKit kullanarak çözdüm ve bir URL'yi doğrulamak için hızlı bir normal ifade oluşturdum;

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

Daha sonra matchedString'in subjectString'e eşit olup olmadığını ve bu durumda URL'nin geçerli olup olmadığını kontrol ederim :)

Normal ifadem yanlışsa beni düzeltin;)


Yanılıyor olabilirim, ancak normal ifadenin URL'leri sorgu dizeleri veya adlandırılmış bağlantılarla doğrulamadığına inanıyorum.
hpique

(Http | https): // 'yi ((http | https): //) * ile değiştirerek önek bölümünü isteğe bağlı hale getirebilirsiniz, ancak bu çok çeşitli
urllere

4

İşin garibi, burada gerçekten çok basit bir çözüm bulamadım, ancak yine de kullanım http/ httpsbağlantılar için iyi bir iş çıkardım .

Unutmayın, BU mükemmel bir çözüm DEĞİL, ancak aşağıdaki durumlarda işe yaradı. Özetle, normal ifade URL'nin http://veya ile başlayıp başlamadığını test https://eder, ardından en az 1 karakter olup olmadığını , ardından bir noktayı kontrol eder ve ardından en az 1 karakteri tekrar kontrol eder. Boşluğa izin verilmez.

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

Bu URL'lere göre VALID test edildi:

@"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"

GEÇERSİZ olarak şu URL'lere göre test edildi:

@"",
@"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'lerin kaynağı: https://mathiasbynens.be/demo/url-regex


3

Bunu istemiyorsanız kullanabilirsiniz httpveya httpsveyawww

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

misal

- (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"];
}

Çıktı:

INVALID: google
VALID: google.de
VALID: www.google.de
VALID: http://www.google.de
VALID: http://google.de

Bu çok ilginç görünüyor. % 100 kurşun geçirmez mi?
Supertecnoboff

3

Lefakir'in çözümünün bir sorunu var. Normal ifadesi " http://instagram.com/p/4Mz3dTJ-ra/ " ile eşleşemez . URL bileşeni, sayısal ve değişmez karakteri birleştirdi. Normal ifadesi bu tür url'ler için başarısız.

İşte benim gelişimim.

"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*)+)+(/)?(\\?.*)?"

2

Bunu yapmanın en kolay yolunu buldum:

- (BOOL)validateUrl: (NSURL *)candidate
{
    NSURLRequest *req = [NSURLRequest requestWithURL:candidate];
    return [NSURLConnection canHandleRequest:req];
}

Bir süredir kullanıyorum ve iyi çalışıyor gibi görünüyor. Ayrıca yeni TLD'lerle ( namecheap.com/domains/new-tlds/explore.aspx ) iyi oynuyor gibi görünüyor .
julianwyz

Bu anlamsız. URL'niz geçersiz dizeyse, bunun NSURLyerine kontrol edilebilmesi için bir oluşturulurken çökecektir. Ve yine de eski API kullanıyor.
Legoless

@Legoless sadece bir deneyebilir ...
COBB


1

Onaylanan cevap yanlış. İçinde "-" olan bir URL var ve doğrulama başarısız oluyor.


1

Tweeked Vaibhav'ın G + bağlantılarını destekleme yanıtı:

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


1

Sonunda / olmayan bazı URL'ler yukarıdaki çözümlerde doğru olarak algılanmaz. Yani bu yardımcı olabilir.

  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
    }
}

1

Swift'de URL Doğrulaması

Detaylar

Xcode 8.2.1, Swift 3

Kod

enum URLSchemes: Dize

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
    }
}

uzantı Dizesi

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
    }
}

Kullanım

 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)
}

Sonuç

görüntü açıklamasını buraya girin


1

Hedef 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);
}

Bu yardımcı olur umarım!


0

kullanıcının girdiği şeyin bir URL olup olmadığını kontrol etmek mi istediniz? Normal bir ifade kadar basit olabilir, örneğin dizenin içerip içermediğini kontrol etmek www.(bu yahoo messenger'ın kullanıcı durumunun bir bağlantı olup olmadığını kontrol etmesidir)
umarım yardım eder


0

Bencilce, KSURLFormatterhem girdiyi doğrulamak hem de onu NSURLbaşa çıkabilecek bir şeye dönüştürmek için bir örnek kullanmayı öneririm .


Bunun bir iOS çeşidi var mı?
capikaw

İOS'ta gayet iyi çalışması gerekir. Olmazsa düzeltin ve bana bir çekme isteği gönderin veya bir sorun
Mike Abdullah

0

Düzenli ifade dizesini kullanarak her türlü doğrulamayı idare edebilen kalıtsal UITextField sınıfını yarattım. Bunun için onlara sırayla tüm normal ifade dizesini ve doğrulama başarısız olduğunda göstermek istediğiniz mesajlarını vermeniz yeterlidir. Daha fazla bilgi için bloguma bakabilirsiniz, bu size gerçekten yardımcı olacaktır

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


0

@ Anthony'nin cevabını hızlı olarak genişleterek, Stringisteğe bağlı döndüren bir kategori yazdım NSURL. Dönüş değeri nilise Stringbir URL olması için valide edilemez.

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'teki çözümüm:

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
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.