Cách xác thực url trên iPhone


90

Trong ứng dụng iPhone mà tôi đang phát triển, có một cài đặt mà bạn có thể nhập URL, vì hình thức và chức năng, URL này cần được xác thực trực tuyến cũng như ngoại tuyến.

Cho đến nay tôi vẫn chưa thể tìm thấy bất kỳ phương pháp nào để xác thực url, vì vậy câu hỏi đặt ra là;

Làm cách nào để xác thực đầu vào URL trên iPhone (Objective-C) trực tuyến cũng như ngoại tuyến?


Đọc các bình luận cho câu trả lời của anh ấy, xác nhận không hoạt động chính xác.
Thizzer

Câu trả lời:


98

Nhờ bài đăng này , bạn có thể tránh sử dụng RegexKit. Đây là giải pháp của tôi (hoạt động cho sự phát triển của iPhone với 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];
}

Nếu bạn muốn kiểm tra Swift, giải pháp của tôi đưa ra bên dưới:

 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
Điều này chỉ làm việc cho các url của kiểu " webr.ly " không làm việc cho các url với các thông số như youtube.com/watch?v=mqgExtdNMBk
hữu ích

5
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+". Nó nên làm cho http: // hoặc https: // là tùy chọn.
Yeung

không hoạt động cho google.com, www.google.com và cả //www.google.com
Revinder

các url sau không hoạt động trong trường hợp của tôi. money.cnn.com/2015/10/19/technology/apple-app-store/...
DJtiwari

@DJtiwari +1 vâng nó không hoạt động. Bạn có tìm thấy bất kỳ giải pháp khắc phục nào cho điều đó không?
Hamza MHIRA

239

Tại sao không chỉ đơn giản là dựa vào Foundation.framework?

Điều đó thực hiện công việc và không yêu cầu 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)
}

Theo tài liệu của Apple:

URLWithString: Tạo và trả về một đối tượng NSURL được khởi tạo bằng một chuỗi được cung cấp.

+ (id)URLWithString:(NSString *)URLString

Thông số

URLString: Chuỗi để khởi tạo đối tượng NSURL. Phải tuân theo RFC 2396. Phương thức này phân tích cú pháp URLString theo RFCs 1738 và 1808.

Giá trị trả lại

Một đối tượng NSURL được khởi tạo bằng URLString. Nếu chuỗi không đúng định dạng, trả về nil.


1
Tôi đồng ý với một số người khác ở đây. Đây là một giải pháp tốt hơn nhiều so với các biểu thức chính quy. Đây phải là câu trả lời được kiểm tra chính xác.
Diego Barros

1
@MrThys - Bạn có thể cung cấp ví dụ về các url không đúng định dạng nào mà điều này không bắt được không? Sẽ rất tuyệt nếu biết .. có vẻ là một giải pháp tuyệt vời cho đến nay.
Don Vaughn

7
@DonamiteIsTnt URL http://www.aol.comhttp://www.nytimes.comvượt qua bài kiểm tra này.
Aaron Brager

1
Mã sẽ không kiểm tra url không đúng định dạng. Ví dụ: <code> afasd </ code >, url sẽ vẫn vượt qua bài kiểm tra
acceptl

39
Tài liệu sai. Viết một vài bài kiểm tra - NSURLkhông trả về nil khi tôi vượt qua chuỗi @ "# @ # @ $ ##% $ # $ #" hoặc @ "tp: / fdfdfsfdsf". Vì vậy, phương pháp này sẽ vô dụng để kiểm tra các URL HTTP hợp lệ và những thứ tương tự.
Tony Arnold

32

Thay vì viết các biểu thức chính quy của riêng bạn, hãy dựa vào Apple. Tôi đã sử dụng một danh mục trên NSStringđó dùng NSDataDetectorđể kiểm tra sự hiện diện của một liên kết trong một chuỗi. Nếu phạm vi của liên kết được tìm thấy NSDataDetectorbằng độ dài của toàn bộ chuỗi thì đó là một URL hợp lệ.

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

Cực kì thông minh. Kỹ thuật thực sự. {Bạn biết đấy, tôi đã gặp một vấn đề kỳ lạ là nếu tôi gửi cho nó chuỗi theo nghĩa đen là "<null>", nó sẽ bị lỗi! Không bao giờ có thể hình dung ra được.}
Fattie

Ah - nó là "<null>" trong con trai, mà quả táo cung cấp hữu ích như một NSNull! : O
Fattie

Tôi đã tạo một ý chính nơi tôi bắt đầu thêm các trường hợp thử nghiệm cho đoạn mã này. Điền miễn phí để thêm nhiều hơn nữa. gist.github.com/b35097bad451c59e23b1.git
Yevhen Dubinin

26

Giải pháp của tôi với 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)
}

Cho thử nghiệm:

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

Các kết quả:

false
false
false
true
false
false
true
true
false
false
false

10

dùng cái này-

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

1
i sao chép nó chỉ đơn giản cho asp.net validator biểu thức chính quy;)
Vaibhav Saran

hoàn hảo, vấn đề duy nhất là nó không nhận rawww.google.com/+gplusname
MuhammadBassio

5

Tôi đã giải quyết vấn đề bằng cách sử dụng RegexKit và xây dựng một regex nhanh để xác thực URL;

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

Sau đó, tôi kiểm tra xem Chuỗi đối sánh có bằng với Chuỗi chủ đề không và nếu đúng như vậy thì url có hợp lệ không :)

Hãy sửa tôi nếu regex của tôi sai;)


Tôi có thể sai, nhưng tôi tin rằng regex không xác thực các url bằng các chuỗi truy vấn hoặc các neo được đặt tên.
hpique

Bạn có thể làm cho các tùy chọn prefix phần bằng cách thay thế (http | https): // với ((http | https): //) * nhưng điều này sẽ cho phép một loạt rất rộng của các url
Thizzer

4

Thật kỳ lạ, tôi đã không thực sự tìm thấy một giải pháp ở đây rất đơn giản, nhưng vẫn thực hiện tốt công việc xử lý http/ httpsliên kết.

Xin lưu ý, ĐÂY KHÔNG PHẢI là một giải pháp hoàn hảo, nhưng nó đã hiệu quả với các trường hợp dưới đây. Tóm lại, regex kiểm tra xem URL bắt đầu bằng http://hoặc https://, sau đó kiểm tra ít nhất 1 ký tự, sau đó kiểm tra dấu chấm và sau đó kiểm tra lại cho ít nhất 1 ký tự. Không còn khoảng trống cho phép.

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

Đã kiểm tra VALID đối với các URL này:

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

INVALID đã kiểm tra đối với các URL này:

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

Nguồn URL: https://mathiasbynens.be/demo/url-regex


3

Bạn có thể sử dụng điều này nếu bạn không muốn httphoặc httpshoặcwww

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

thí dụ

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

Đầu ra:

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

Điều này có vẻ rất thú vị. Nó có chống đạn 100% không?
Supertecnoboff

3

Giải pháp của Lefakir có một vấn đề. Regex của anh ấy không thể sánh với " http://instagram.com/p/4Mz3dTJ-ra/ ". Thành phần url đã kết hợp ký tự số và ký tự chữ. Regex của anh ấy không thành công các url như vậy.

Đây là cải tiến của tôi.

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

2

Tôi đã tìm thấy cách dễ nhất để làm điều này như sau:

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

Tôi đã sử dụng nó một thời gian và nó có vẻ hoạt động tốt. Nó cũng có vẻ hoạt động tốt với các TLD mới ( namecheap.com/domains/new-tlds/explore.aspx ).
julianwyz

Điều này là vô nghĩa. Nếu URL của bạn là chuỗi không hợp lệ, nó sẽ gặp sự cố khi tạo NSURL, vì vậy có thể được kiểm tra thay vì điều này. Và thậm chí như vậy nó sử dụng API cũ.
Legoless

@Legoless có thể thử ... bắt xung quanh nó không?
COBB

2

Đoạn mã dưới đây sẽ cho phép bạn tìm thấy các URL hợp lệ

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

cho các URL như vậy


1

Câu trả lời được chấp thuận là không chính xác. Tôi có một URL có dấu "-" và quá trình xác thực không thành công.


1

Đã đăng câu trả lời của Vaibhav để hỗ trợ liên kết G +:

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


1

Một số URL không có / ở cuối không được phát hiện là URL chính xác trong các giải pháp ở trên. Vì vậy, điều này có thể hữu ích.

  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

Xác thực URL trong Swift

Chi tiết

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

chuỗi mở rộng

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

Sử dụng

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

Kết quả

nhập mô tả hình ảnh ở đây


1

Mục tiêu 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);
}

Hi vọng điêu nay co ich!


0

ý của bạn là kiểm tra xem những gì người dùng đã nhập có phải là URL không? Nó có thể đơn giản như một biểu thức chính quy, ví dụ kiểm tra xem chuỗi có chứa không www.(đây là cách mà yahoo messenger kiểm tra trạng thái người dùng có phải là một liên kết hay không)
Mong rằng giúp đỡ


0

Ích kỷ, tôi khuyên bạn nên sử dụng một KSURLFormatterphiên bản để xác thực đầu vào và chuyển đổi nó thành thứ gì đó NSURLcó thể xử lý.


Có một hương vị iOS của điều này?
capikaw 29/12/12

Nó sẽ hoạt động tốt trên iOS. Nếu không, sửa chữa nó lên và gửi cho tôi một yêu cầu kéo, hoặc nộp một vấn đề
Mike Abdullah

0

Tôi đã tạo lớp kế thừa của UITextField có thể xử lý tất cả các loại xác thực bằng cách sử dụng chuỗi regex. Trong điều này, bạn chỉ cần cung cấp cho họ tất cả chuỗi regex theo thứ tự và thông báo của họ mà bạn muốn hiển thị khi xác thực không thành công. Bạn có thể kiểm tra blog của tôi để biết thêm thông tin, nó thực sự sẽ giúp bạn

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


0

Mở rộng câu trả lời của @ Anthony cho nhanh chóng, tôi đã viết một danh mục Stringtrả về một tùy chọn NSURL. Giá trị trả về là nilnếu Stringkhông thể được xác nhận là một 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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.