So überprüfen Sie eine URL auf dem iPhone


90

In einer iPhone-App, die ich entwickle, gibt es eine Einstellung, in der Sie eine URL eingeben können. Aufgrund von Form und Funktion muss diese URL sowohl online als auch offline überprüft werden.

Bisher konnte ich keine Methode finden, um die URL zu validieren. Die Frage ist also:

Wie überprüfe ich eine URL-Eingabe auf dem iPhone (Objective-C) sowohl online als auch offline?


Lesen Sie die Kommentare zu seiner Antwort, die Validierung funktioniert nicht richtig.
Thizzer

Antworten:


98

Dank dieses Beitrags können Sie die Verwendung von RegexKit vermeiden. Hier ist meine Lösung (funktioniert für die iPhone-Entwicklung mit 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];
}

Wenn Sie in Swift meine unten angegebene Lösung einchecken möchten:

 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
Dies funktioniert nur für URLs vom Typ " webr.ly " nicht für URLs mit Parametern wie youtube.com/watch?v=mqgExtdNMBk
The usFuL

5
((http|https)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"Es sollte http: // oder https: // optional sein.
Yeung

funktioniert nicht für google.com, www.google.com und auch für //www.google.com
Revinder

Die folgenden URLs funktionieren in meinem Fall nicht. money.cnn.com/2015/10/19/technology/apple-app-store/…
DJtiwari

@DJtiwari +1 Ja, es funktioniert nicht. Hast du eine Lösung dafür gefunden?
Hamza MHIRA

239

Warum nicht stattdessen einfach darauf vertrauen Foundation.framework?

Das macht den Job und erfordert nicht 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)
}

Laut Apple-Dokumentation:

URLWithString: Erstellt ein NSURL-Objekt, das mit einer angegebenen Zeichenfolge initialisiert wurde, und gibt es zurück.

+ (id)URLWithString:(NSString *)URLString

Parameter

URLString: Die Zeichenfolge, mit der das NSURL-Objekt initialisiert werden soll. Muss RFC 2396 entsprechen. Diese Methode analysiert URLString gemäß den RFCs 1738 und 1808.

Rückgabewert

Ein mit URLString initialisiertes NSURL-Objekt. Wenn die Zeichenfolge fehlerhaft war, wird null zurückgegeben.


1
Ich stimme einigen der anderen hier zu. Dies ist eine viel bessere Lösung, als mit regulären Ausdrücken herumzuspielen. Dies sollte die korrekt überprüfte Antwort sein.
Diego Barros

1
@MrThys - Gibt es eine Möglichkeit, Beispiele dafür anzugeben, welche fehlerhaften URLs dies nicht abfängt? Wäre toll zu wissen .. scheint bisher eine hervorragende Lösung zu sein.
Don Vaughn

7
@DonamiteIsTnt Die URL besteht http://www.aol.comhttp://www.nytimes.comdiesen Test.
Aaron Brager

1
Der Code sucht nicht nach fehlerhafter URL. Beispiel: <code> afasd </ code >, die URL wird den Test noch bestehen
denil

39
Die Dokumente sind falsch. Schreiben Sie ein paar Tests - NSURLgibt nicht null zurück, wenn ich eine Zeichenfolge von @ "# @ # @ $ ##% $ # $ #" oder @ "tp: / fdfdfsfdsf" übergebe. Diese Methode ist also für die Überprüfung gültiger HTTP-URLs und dergleichen unbrauchbar.
Tony Arnold

32

Verlassen Sie sich auf die von Apple, anstatt Ihre eigenen regulären Ausdrücke zu schreiben. Ich habe eine Kategorie NSStringverwendet NSDataDetector, um das Vorhandensein eines Links in einer Zeichenfolge zu testen. Wenn der Bereich des gefundenen Links NSDataDetectorder Länge der gesamten Zeichenfolge entspricht, handelt es sich um eine gültige 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;
}

Extrem klug. Echtes Engineering. {Weißt du, ich hatte ein seltsames Problem, bei dem die Zeichenfolge abstürzt, wenn ich sie buchstäblich "<null>" sende! Konnte es nie herausfinden.}
Fattie

Ah - es war "<null>" im Sohn, den Apple sinnvoll als NSNull liefert! : O
Fattie

Ich habe eine Übersicht erstellt, in der ich angefangen habe, Testfälle für diesen Ausschnitt hinzuzufügen. Füllen Sie kostenlos aus, um weitere hinzuzufügen. gist.github.com/b35097bad451c59e23b1.git
Yevhen Dubinin

26

Meine Lösung mit 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)
}

Zum Test:

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

Ergebnisse:

false
false
false
true
false
false
true
true
false
false
false

10

benutze das-

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

1
Ich habe es einfach für asp.net Validator für reguläre Ausdrücke kopiert;)
Vaibhav Saran

Perfekt, das einzige Problem ist, dass es nicht erkenntwww.google.com/+gplusname
MuhammadBassio

5

Ich habe das Problem mit RegexKit gelöst und einen schnellen regulären Ausdruck erstellt , um eine URL zu validieren.

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

Dann überprüfe ich, ob der MatchingString dem SubjectString entspricht und ob die URL gültig ist :)

Korrigiere mich, wenn mein Regex falsch ist;)


Ich könnte mich irren, aber ich glaube, dass Regex URLs nicht mit Abfragezeichenfolgen oder benannten Ankern validiert.
Hpique

Sie könnten den Präfixteil optional machen, indem Sie (http | https): // durch ((http | https): //) * ersetzen, aber dies würde eine sehr große Vielfalt von URLs ermöglichen
Thizzer

4

Seltsamerweise habe ich hier keine wirklich einfache Lösung gefunden, aber trotzdem gute Arbeit für die Handhabung http/ httpsLinks geleistet .

Denken Sie daran, dies ist keine perfekte Lösung, aber es hat für die folgenden Fälle funktioniert. Zusammenfassend testet der Regex, ob die URL mit http://oder beginnt, sucht https://dann nach mindestens 1 Zeichen, sucht dann nach einem Punkt und prüft dann erneut nach mindestens 1 Zeichen. Keine Leerzeichen erlaubt.

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

GÜLTIG gegen diese URLs getestet:

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

UNGÜLTIG gegen diese URLs getestet:

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

Quelle der URLs: https://mathiasbynens.be/demo/url-regex


3

Sie können dies verwenden, wenn Sie nicht möchten httpoder httpsoderwww

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

Beispiel

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

Ausgabe:

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

Das scheint sehr interessant zu sein. Ist es 100% kugelsicher?
Supertecnoboff

3

Lefakirs Lösung hat ein Problem. Seine Regex kann nicht mit " http://instagram.com/p/4Mz3dTJ-ra/ " übereinstimmen . Die URL-Komponente hat einen kombinierten numerischen und wörtlichen Charakter. Seine Regex scheitern an solchen URLs.

Hier ist meine Verbesserung.

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

2

Ich habe festgestellt, dass dies am einfachsten ist:

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

Ich benutze es jetzt schon eine Weile und es scheint gut zu funktionieren. Es scheint auch gut mit den neuen TLDs zu spielen ( namecheap.com/domains/new-tlds/explore.aspx ).
Julianwyz

Das ist sinnlos. Wenn Ihre URL eine ungültige Zeichenfolge ist, stürzt sie beim Erstellen einer Zeichenfolge ab, NSURLsodass diese stattdessen überprüft werden kann. Und trotzdem verwendet es die alte API.
Legoless

@Legoless könnte nur einen Versuch gebrauchen ... um es herum zu fangen?
COBB


1

Die genehmigte Antwort ist falsch. Ich habe eine URL mit einem "-" und die Validierung schlägt fehl.


1

Tweeked Vaibhavs Antwort zur Unterstützung von G + -Links:

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


1

Einige URLs ohne / am Ende werden in den obigen Lösungen nicht als die richtige erkannt. Das könnte also hilfreich sein.

  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-Validierung in Swift

Einzelheiten

Xcode 8.2.1, Swift 3

Code

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

Erweiterungszeichenfolge

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

Verwendung

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

Ergebnis

Geben Sie hier die Bildbeschreibung ein


1

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

Hoffe das hilft!


0

Wollten Sie überprüfen, ob der vom Benutzer eingegebene URL ist? Es kann so einfach wie ein regulärer Ausdruck sein, zum Beispiel zu überprüfen, ob die Zeichenfolge enthält www.(auf diese Weise prüft Yahoo Messenger, ob der Benutzerstatus ein Link ist oder nicht).
Hoffe, dass dies hilft


0

Selbstsüchtig würde ich vorschlagen, eine KSURLFormatterInstanz zu verwenden, um Eingaben zu validieren und sie in etwas zu konvertieren, das sie verarbeiten NSURLkann.


Gibt es eine iOS-Variante davon?
Capikaw

Es sollte unter iOS gut funktionieren. Wenn dies nicht der Fall ist, beheben Sie das Problem und senden Sie mir eine Pull-Anfrage oder reichen Sie ein Problem ein
Mike Abdullah,

0

Ich habe eine geerbte Klasse von UITextField erstellt, die alle Arten von Validierungen mithilfe von Regex-Zeichenfolgen verarbeiten kann. In diesem Fall müssen Sie ihnen nur die gesamte Regex-Zeichenfolge nacheinander und ihre Nachricht geben, die Sie anzeigen möchten, wenn die Validierung fehlschlägt. Sie können meinen Blog für weitere Informationen überprüfen, es wird Ihnen wirklich helfen

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


0

Als ich @ Anthonys Antwort auf Swift erweiterte, schrieb ich eine Kategorie, für Stringdie ein optionales zurückgegeben wird NSURL. Der Rückgabewert ist, nilwenn Stringnicht überprüft werden kann, ob es sich um eine URL handelt.

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)
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.