วิธีตรวจสอบ url บน iPhone


90

ในแอพ iPhone ที่ฉันกำลังพัฒนามีการตั้งค่าที่คุณสามารถป้อน URL ได้เนื่องจากรูปแบบและฟังก์ชัน URL นี้ต้องได้รับการตรวจสอบความถูกต้องทางออนไลน์และออฟไลน์

จนถึงตอนนี้ฉันยังไม่พบวิธีการใด ๆ ในการตรวจสอบ url ดังนั้นคำถามคือ;

ฉันจะตรวจสอบการป้อน URL บน iPhone (Objective-C) แบบออนไลน์และออฟไลน์ได้อย่างไร


อ่านความคิดเห็นสำหรับคำตอบของเขาการตรวจสอบไม่ทำงานอย่างถูกต้อง
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 my solution ที่ระบุด้านล่าง:

 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 ตาม RFCs 1738 และ 1808

ส่งคืนค่า

อ็อบเจ็กต์ NSURL เริ่มต้นด้วย URLString หากสตริงผิดรูปแบบให้ส่งกลับค่า nil


1
ฉันเห็นด้วยกับคนอื่น ๆ ที่นี่ นี่เป็นวิธีแก้ปัญหาที่ดีกว่ามากในการใช้นิพจน์ทั่วไป นี่ควรเป็นคำตอบที่ตรวจสอบได้อย่างถูกต้อง
Diego Barros

1
@MrThys - มีโอกาสใดที่คุณสามารถให้ตัวอย่างของ URL ที่ผิดรูปแบบซึ่งไม่สามารถตรวจจับได้? จะดีมากที่ได้รู้ว่า .. ดูเหมือนจะเป็นทางออกที่ดีมาก
Don Vaughn

7
@DonamiteIsTnt URL http://www.aol.comhttp://www.nytimes.comผ่านการทดสอบนี้
Aaron Brager

1
รหัสจะไม่ตรวจสอบ url ที่ผิดรูปแบบ เช่น <code> afasd </ code > url จะยังคงผ่านการทดสอบ
denil

39
เอกสารไม่ถูกต้อง เขียนการทดสอบสองสามข้อ - NSURLไม่คืนค่าศูนย์เมื่อฉันส่งสตริง @ "# @ # @ $ ##% $ # $ #" หรือ @ "tp: / fdfdfsfdsf" ดังนั้นวิธีนี้จะไม่มีประโยชน์สำหรับการตรวจสอบ HTTP URL ที่ถูกต้องและสิ่งที่คล้ายกัน
Tony Arnold

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>" ในตัวของลูกชายซึ่งแอปเปิ้ลใช้เป็นเครื่อง NSNull! : O
Fattie

ฉันสร้างส่วนสำคัญที่ฉันเริ่มเพิ่มกรณีทดสอบสำหรับสนิปนี้ เติมฟรีเพื่อเพิ่มอีก gist.github.com/b35097bad451c59e23b1.git
Yevhen Dubinin

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 เท่านั้น)
Vaibhav Saran

สมบูรณ์แบบปัญหาเดียวคือมันไม่รู้จักwww.google.com/+gplusname
MuhammadBassio

5

ฉันแก้ไขปัญหาโดยใช้RegexKitและสร้าง regex ด่วนเพื่อตรวจสอบ URL

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

จากนั้นฉันจะตรวจสอบว่า matchedString เท่ากับ subjectString หรือไม่และหากเป็นเช่นนั้น url ก็ถูกต้อง :)

แก้ไขฉันหาก regex ของฉันผิด;)


ฉันอาจจะคิดผิด แต่ฉันเชื่อว่า regex ไม่ได้ตรวจสอบความถูกต้องของ URL ด้วยสตริงการสืบค้นหรือจุดยึดที่ตั้งชื่อ
hpique

คุณสามารถทำให้ส่วนคำนำหน้าเป็นทางเลือกได้โดยการแทนที่ (http | https): // ด้วย ((http | https): //) * แต่จะอนุญาตให้มี URL ที่หลากหลายมาก
Thizzer

4

น่าแปลกที่ฉันไม่พบวิธีแก้ปัญหาที่นี่มันง่ายมาก แต่ก็ยังทำได้ดีในการจัดการhttp/ httpsลิงค์

โปรดทราบว่านี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบ แต่ใช้ได้กับกรณีด้านล่าง โดยสรุป regex จะทดสอบว่า 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];
}

ทดสอบ VALID กับ 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

ดูเหมือนว่าน่าสนใจมาก เป็นหลักฐานกระสุน 100% หรือไม่?
Supertecnoboff

3

วิธีแก้ปัญหาของ Lefakir มีประเด็นเดียว regex ของเขาไม่สามารถจับคู่กับ " http://instagram.com/p/4Mz3dTJ-ra/ " องค์ประกอบ URL ได้รวมอักขระที่เป็นตัวเลขและตัวอักษร regex ของเขาล้มเหลว URL ดังกล่าว

นี่คือการปรับปรุงของฉัน

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

2

ฉันพบวิธีที่ง่ายที่สุดในการทำเช่นนี้:

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

ฉันใช้มาระยะหนึ่งแล้วและดูเหมือนว่าจะใช้งานได้ดี ดูเหมือนว่าจะเล่นได้ดีกับ TLD ใหม่ ( namecheap.com/domains/new-tlds/explore.aspx )
julianwyz

นี่ไม่มีจุดหมาย หาก URL ของคุณเป็นสตริงที่ไม่ถูกต้อง URL จะหยุดทำงานขณะสร้างNSURLเพื่อให้สามารถตรวจสอบแทนสิ่งนี้ได้ และถึงแม้จะใช้ API แบบเก่า
Legoless

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

สำหรับ URLS ดังกล่าว


1

คำตอบที่ได้รับอนุมัติไม่ถูกต้อง ฉันมี URL ที่มี "-" อยู่และการตรวจสอบความถูกต้องล้มเหลว



1

ตรวจไม่พบ URL บางรายการที่ไม่มี / ต่อท้ายว่าเป็น 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
    }
}

1

การตรวจสอบ URL ใน Swift

รายละเอียด

Xcode 8.2.1, Swift 3

รหัส

enum URLSchemes: สตริง

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

วัตถุประสงค์ค

- (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 ตรวจสอบสถานะผู้ใช้ว่าเป็นลิงก์หรือไม่)
หวังว่าจะช่วยได้


0

ด้วยความเห็นแก่ตัวฉันขอแนะนำให้ใช้KSURLFormatterอินสแตนซ์เพื่อตรวจสอบความถูกต้องของอินพุตและแปลงเป็นสิ่งที่NSURLสามารถจัดการได้


iOS มีรสชาตินี้หรือไม่?
capikaw

ควรใช้งานได้ดีบน iOS หากไม่เป็นเช่นนั้นให้แก้ไขและส่งคำขอให้ดึงหรือยื่นปัญหา
Mike Abdullah

0

ฉันได้สร้างคลาสที่สืบทอดมาของ UITextField ซึ่งสามารถจัดการการตรวจสอบความถูกต้องทุกประเภทโดยใช้สตริง regex ในสิ่งนี้คุณต้องให้สตริง regex ทั้งหมดตามลำดับและข้อความที่คุณต้องการแสดงเมื่อการตรวจสอบล้มเหลว คุณสามารถตรวจสอบบล็อกของฉันสำหรับข้อมูลเพิ่มเติมมันจะช่วยคุณได้จริงๆ

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


0

ขยาย @ คำตอบที่แอนโทนี่ไปอย่างรวดเร็วผมเขียนหมวดหมู่บนซึ่งผลตอบแทนที่เป็นตัวเลือก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
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.