[ios] iPhone에서 URL을 확인하는 방법

제가 개발중인 iPhone 앱에는 URL을 입력 할 수있는 설정이 있습니다. 형식과 기능 때문에이 URL은 오프라인뿐 아니라 온라인에서도 유효성을 검사해야합니다.

지금까지 URL의 유효성을 검사하는 방법을 찾을 수 없었으므로 문제는 다음과 같습니다.

iPhone (Objective-C)의 URL 입력을 온라인과 오프라인에서 어떻게 확인합니까?



답변

이 게시물 덕분에 RegexKit 사용을 피할 수 있습니다. 내 솔루션은 다음과 같습니다 (iOS> 3.0으로 iPhone 개발 용으로 작동).

- (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에서 내 솔루션을 확인하려면 아래에 나와 있습니다.

 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
    }


답변

대신 단순히 의존하지 않는 이유는 무엇 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을 준수해야합니다.이 메소드는 RFC 1738 및 1808에 따라 URLString을 구문 분석합니다.

반환 값

URLString으로 초기화 된 NSURL 개체입니다. 문자열 형식이 잘못된 경우 nil을 반환합니다.


답변

자신 만의 정규식을 작성하는 대신 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;
}


답변

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


답변

이것을 사용하십시오

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


답변

RegexKit을 사용하여 문제를 해결하고 URL의 유효성을 검사하는 빠른 정규식을 빌드했습니다.

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

그런 다음 matchedString이 subjectString과 같은지 확인하고이 경우 URL이 유효한지 확인합니다. 🙂

내 정규식이 잘못된 경우 정정하십시오.)


답변

이상하게도 저는 여기서 매우 간단한 해결책을 찾지 못했지만 여전히 처리 http/ https링크에 대해 괜찮은 작업을 수행했습니다 .

이것은 완벽한 해결책은 아니지만 아래의 경우에 효과적입니다. 요약하면 정규식은 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];
}

다음 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에 대해 INVALID 테스트 :

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