Cara memvalidasi url di iPhone

90

Di aplikasi iPhone yang saya kembangkan, ada pengaturan di mana Anda dapat memasukkan URL, karena bentuk & fungsi URL ini perlu divalidasi secara online maupun offline.

Sejauh ini saya belum dapat menemukan metode apa pun untuk memvalidasi url, jadi pertanyaannya adalah;

Bagaimana cara memvalidasi input URL di iPhone (Objective-C) secara online maupun offline?

Thizzer
sumber
Baca komentar untuk jawabannya, validasi tidak berfungsi dengan benar.
Thizzer

Jawaban:

98

Berkat posting ini , Anda dapat menghindari penggunaan RegexKit. Inilah solusi saya (berfungsi untuk pengembangan iphone dengan 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];
}

Jika Anda ingin memeriksa di Swift, solusi saya diberikan di bawah ini:

 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
    }
lefakir.dll
sumber
7
Ini hanya berfungsi untuk url jenis " webr.ly " tidak berfungsi untuk url dengan parameter seperti youtube.com/watch?v=mqgExtdNMBk
ThE uSeFuL
5
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"Itu harus membuat http: // atau https: // opsional.
Yeung
tidak berfungsi untuk google.com, www.google.com dan juga untuk //www.google.com
Revinder
url berikut tidak berfungsi dalam kasus saya. money.cnn.com/2015/10/19/technology/apple-app-store/…
DJtiwari
@DJtiwari +1 ya tidak berhasil, apakah Anda menemukan perbaikan untuk itu?
Hamza MHIRA
239

Mengapa tidak mengandalkan saja Foundation.framework?

Itu melakukan pekerjaan dan tidak membutuhkan 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)
}

Menurut dokumentasi Apple:

URLWithString: Membuat dan mengembalikan objek NSURL yang diinisialisasi dengan string yang disediakan.

+ (id)URLWithString:(NSString *)URLString

Parameter

URLString: String yang digunakan untuk menginisialisasi objek NSURL. Harus sesuai dengan RFC 2396. Metode ini mengurai URLString menurut RFC 1738 dan 1808.

Nilai Kembali

Objek NSURL diinisialisasi dengan URLString. Jika string salah format, mengembalikan nihil.

Vincent Guerci
sumber
1
Saya setuju dengan beberapa yang lain di sini. Ini adalah solusi yang jauh lebih baik daripada mengutak-atik ekspresi reguler. Ini harus menjadi jawaban yang diperiksa dengan benar.
Diego Barros
1
@MrThys - Adakah kemungkinan Anda dapat memberikan contoh url rusak mana yang tidak tertangkap? Akan sangat menyenangkan untuk mengetahui .. tampaknya solusi yang sangat baik sejauh ini.
Don Vaughn
7
@DonamiteIsTnt URL http://www.aol.comhttp://www.nytimes.comlulus tes ini.
Aaron Brager
1
Kode tidak akan memeriksa format url yang salah. Contoh: <code> afasd </ code >, url masih akan lulus tes
denil
39
Dokumentasinya salah. Tulis beberapa pengujian - NSURLtidak mengembalikan nol ketika saya meneruskan string @ "# @ # @ $ ##% $ # $ #", atau @ "tp: / fdfdfsfdsf". Jadi metode ini tidak akan berguna untuk memeriksa URL HTTP yang valid dan sejenisnya.
Tony Arnold
32

Alih-alih menulis ekspresi reguler Anda sendiri, andalkan ekspresi reguler Apple. Saya telah menggunakan kategori NSStringyang digunakan NSDataDetectoruntuk menguji keberadaan tautan dalam string. Jika rentang tautan yang ditemukan NSDataDetectorsama dengan panjang seluruh string, maka itu adalah URL yang valid.

- (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;
}
Anthony
sumber
Sangat pintar. Rekayasa nyata. {Anda tahu, saya punya masalah aneh di mana jika saya mengirimnya string secara harfiah "<null>", itu macet! Tidak pernah bisa memahaminya.}
Fattie
Ah - itu adalah "<null>" pada anak laki-laki, yang disuplai apel dengan berguna sebagai NSNull! : O
Fattie
Saya membuat inti di mana saya mulai menambahkan kasus uji untuk potongan ini. Isi gratis untuk menambahkan lebih banyak. gist.github.com/b35097bad451c59e23b1.git
Yevhen Dubinin
26

Solusi saya dengan 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)
}

Untuk Tes:

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

Hasil:

false
false
false
true
false
false
true
true
false
false
false
Gabriel.Massana
sumber
10

Gunakan ini-

NSString *urlRegEx = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&amp;=]*)?";
Vaibhav Saran
sumber
1
saya menyalinnya hanya untuk validator ekspresi reguler asp.net;)
Vaibhav Saran
sempurna, satu-satunya masalah adalah bahwa ia tidak mengenaliwww.google.com/+gplusname
MuhammadBassio
5

Saya memecahkan masalah menggunakan RegexKit , dan membangun regex cepat untuk memvalidasi URL;

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

Kemudian saya memeriksa apakah matchedString sama dengan subjectString dan jika itu masalahnya url valid :)

Koreksi saya jika regex saya salah;)

Thizzer
sumber
Saya mungkin salah, tetapi saya yakin bahwa regex tidak memvalidasi url dengan string kueri atau jangkar bernama.
hpique
Anda dapat membuat bagian awalan opsional dengan mengganti (http | https): // dengan ((http | https): //) * tetapi ini akan memungkinkan variasi yang sangat luas dari url
Thizzer
4

Anehnya, saya tidak benar-benar menemukan solusi di sini yang sangat sederhana, namun masih melakukan pekerjaan yang baik untuk menangani http/ httpstautan.

Perlu diingat, INI BUKAN solusi sempurna, tetapi berhasil untuk kasus di bawah ini. Singkatnya, regex menguji apakah URL dimulai dengan http://atau https://, lalu memeriksa setidaknya 1 karakter, lalu memeriksa titik, dan sekali lagi memeriksa setidaknya 1 karakter. Tidak ada spasi yang diizinkan.

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

VALID diuji terhadap URL ini:

@"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:[email protected]:8080",
@"http://userid:[email protected]:8080/",
@"http://[email protected]",
@"http://[email protected]/",
@"http://[email protected]:8080",
@"http://[email protected]:8080/",
@"http://userid:[email protected]",
@"http://userid:[email protected]/",
@"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"

Diuji INVALID terhadap URL ini:

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

Sumber URL: https://mathiasbynens.be/demo/url-regex

kgaidis
sumber
3

Anda dapat menggunakan ini jika Anda tidak ingin httpatau httpsatauwww

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

contoh

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

Keluaran:

INVALID: google
VALID: google.de
VALID: www.google.de
VALID: http://www.google.de
VALID: http://google.de
Hiren
sumber
Ini sepertinya sangat menarik. Apakah ini 100% anti peluru?
Supertecnoboff
3

Solusi Lefakir memiliki satu masalah. Regexnya tidak bisa cocok dengan " http://instagram.com/p/4Mz3dTJ-ra/ ". Komponen url menggabungkan karakter numerik dan literal. Regex-nya gagal pada url tersebut.

Inilah peningkatan saya.

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

Saya telah menemukan cara termudah untuk melakukannya seperti ini:

- (BOOL)validateUrl: (NSURL *)candidate
{
    NSURLRequest *req = [NSURLRequest requestWithURL:candidate];
    return [NSURLConnection canHandleRequest:req];
}
julianwyz.dll
sumber
Saya telah menggunakannya untuk sementara waktu sekarang dan tampaknya berfungsi dengan baik. Ini juga tampaknya bermain bagus dengan TLD baru ( namecheap.com/domains/new-tlds/explore.aspx ).
julianwyz
Ini tidak ada gunanya. Jika URL Anda adalah string yang tidak valid, itu akan macet saat membuat NSURL, jadi itu bisa diperiksa alih-alih ini. Dan meski begitu itu menggunakan API lama.
Tanpa kaki
@Legoless bisa mencoba ... menangkap sekitar itu?
COBB
1

Jawaban yang disetujui salah. Saya memiliki URL dengan "-" di dalamnya, dan validasi gagal.

Leander
sumber
1

Tweek jawaban Vaibhav untuk mendukung tautan G +:

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

MuhammadBassio
sumber
1

Beberapa URL tanpa / di akhir tidak terdeteksi sebagai yang benar dalam solusi di atas. Jadi ini mungkin bisa membantu.

  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
sumber
1

Validasi URL di Swift

Detail

Xcode 8.2.1, Swift 3

Kode

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

ekstensi String

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

Pemakaian

 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:[email protected]: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:[email protected]:8080")
    chekUrl(urlString:"http://[email protected]")
    chekUrl(urlString:"http://[email protected]: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)
}

Hasil

masukkan deskripsi gambar di sini

Bodnarchuk dengan mudah
sumber
1

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

Semoga ini membantu!

Dharmesh Mansata
sumber
0

maksud Anda memeriksa apakah yang dimasukkan pengguna adalah URL? Hal ini dapat yang sederhana seperti ekspresi reguler, misalnya memeriksa apakah string mengandung www.(ini adalah cara yang cek yahoo messenger jika status pengguna adalah sebuah link atau tidak)
Harapan yang membantu

phunehehe
sumber
0

Dengan egois, saya akan menyarankan menggunakan sebuah KSURLFormatterinstance untuk memvalidasi input, dan mengubahnya menjadi sesuatu yang NSURLdapat ditangani.

Mike Abdullah
sumber
Apakah ada rasa iOS dari ini?
capikaw
Ini seharusnya berfungsi dengan baik di iOS. Jika tidak, perbaiki dan kirimkan saya permintaan penarikan, atau ajukan masalah
Mike Abdullah
0

Saya telah membuat kelas warisan UITextField yang dapat menangani semua jenis validasi menggunakan string regex. Dalam hal ini Anda hanya perlu memberi mereka semua string regex secara berurutan dan pesan mereka yang ingin Anda tunjukkan ketika validasi gagal. Anda dapat memeriksa blog saya untuk info lebih lanjut, ini akan sangat membantu Anda

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

Dhawal Dawar
sumber
0

Memperluas jawaban @ Anthony untuk swift, saya menulis kategori Stringyang mengembalikan opsional NSURL. Nilai kembaliannya adalah niljika Stringtidak dapat divalidasi menjadi 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)
  }
}
Ayush Goel
sumber
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)
}
Modi Urvish
sumber
0

Solusi saya di 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
    }
}
Nazariy Vlizlo
sumber