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?
Jawaban:
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 }
sumber
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
Itu harus membuat http: // atau https: // opsional.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:
sumber
http://www.aol.comhttp://www.nytimes.com
lulus tes ini.NSURL
tidak mengembalikan nol ketika saya meneruskan string @ "# @ # @ $ ##% $ # $ #", atau @ "tp: / fdfdfsfdsf". Jadi metode ini tidak akan berguna untuk memeriksa URL HTTP yang valid dan sejenisnya.Alih-alih menulis ekspresi reguler Anda sendiri, andalkan ekspresi reguler Apple. Saya telah menggunakan kategori
NSString
yang digunakanNSDataDetector
untuk menguji keberadaan tautan dalam string. Jika rentang tautan yang ditemukanNSDataDetector
sama 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; }
sumber
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
sumber
Gunakan ini-
NSString *urlRegEx = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
sumber
www.google.com/+gplusname
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;)
sumber
Anehnya, saya tidak benar-benar menemukan solusi di sini yang sangat sederhana, namun masih melakukan pekerjaan yang baik untuk menangani
http
/https
tautan.Perlu diingat, INI BUKAN solusi sempurna, tetapi berhasil untuk kasus di bawah ini. Singkatnya, regex menguji apakah URL dimulai dengan
http://
atauhttps://
, 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
sumber
Anda dapat menggunakan ini jika Anda tidak ingin
http
atauhttps
atauwww
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
sumber
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]*)|([-|_])*)+)+(/)?(\\?.*)?"
sumber
Saya telah menemukan cara termudah untuk melakukannya seperti ini:
- (BOOL)validateUrl: (NSURL *)candidate { NSURLRequest *req = [NSURLRequest requestWithURL:candidate]; return [NSURLConnection canHandleRequest:req]; }
sumber
NSURL
, jadi itu bisa diperiksa alih-alih ini. Dan meski begitu itu menggunakan API lama.Kode di bawah ini akan memungkinkan Anda menemukan URL yang valid
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" }
untuk URL tersebut
sumber
Jawaban yang disetujui salah. Saya memiliki URL dengan "-" di dalamnya, dan validasi gagal.
sumber
Tweek jawaban Vaibhav untuk mendukung tautan G +:
NSString *urlRegEx = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-\\+ ./?%&=]*)?";
sumber
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 } }
sumber
Validasi URL di Swift
Detail
Xcode 8.2.1, Swift 3
Kode
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 } }
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
sumber
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!
sumber
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
sumber
Dengan egois, saya akan menyarankan menggunakan sebuah
KSURLFormatter
instance untuk memvalidasi input, dan mengubahnya menjadi sesuatu yangNSURL
dapat ditangani.sumber
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/
sumber
Memperluas jawaban @ Anthony untuk swift, saya menulis kategori
String
yang mengembalikan opsionalNSURL
. Nilai kembaliannya adalahnil
jikaString
tidak 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) } }
sumber
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) }
sumber
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 } }
sumber