如何在iPhone上验证网址

Thy*_*hys 89 iphone url xcode objective-c ios

在我正在开发的iPhone应用程序中,有一个设置可以输入URL,因为形式和功能,此URL需要在线和离线验证.

到目前为止,我还没有找到任何验证网址的方法,所以问题是;

如何在线和离线验证iPhone(Objective-C)上的URL输入?

Vin*_*rci 237

为什么不依靠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)
}
Run Code Online (Sandbox Code Playgroud)

根据Apple文档:

URLWithString:创建并返回使用提供的字符串初始化的NSURL对象.

+ (id)URLWithString:(NSString *)URLString

参数

URLString:用于初始化NSURL对象的字符串.必须符合RFC 2396.此方法根据RFC 1738和1808解析URLString.

回报价值

使用URLString初始化的NSURL对象.如果字符串格式错误,则返回nil.

  • 文档是错误的.写一些测试 - 当我传递一串@"#@#@ $ ##%$#$#"或@"tp:/ fdfdfsfdsf"时,`NSURL`不返回nil.因此,此方法对于检查有效的HTTP URL等无用. (39认同)
  • @DonamiteIsTnt URL"http://www.aol.comhttp:// www.nytimes.com"通过了此测试. (7认同)

lef*_*kir 99

感谢这篇文章,您可以避免使用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];
}
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于"http://www.webr.ly"类型的网址,不适用于http://www.youtube.com/watch?v=mqgExtdNMBk等参数的网址 (7认同)
  • `((HTTP | HTTPS)://)? - | [\\ | /((\\ W)*| |([0-9]*)([_])*)+(((\\w)*|([0-9]*)|([ - | _])*))+"`.它应该使http://或https://是optiional. (5认同)

Ant*_*ony 31

而不是编写自己的正则表达式,依赖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;
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*ana 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)
}
Run Code Online (Sandbox Code Playgroud)

对于测试:

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")
Run Code Online (Sandbox Code Playgroud)

结果:

false
false
false
true
false
false
true
true
false
false
false
Run Code Online (Sandbox Code Playgroud)


Vai*_*ran 10

用这个-

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


Thy*_*hys 5

我使用RegexKit解决了这个问题,并构建了一个快速正则表达式来验证URL;

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

然后我检查matchesString是否等于subjectString,如果是这样,url是有效的:)

如果我的正则表达式错误,请纠正我;)