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.
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)
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)
我使用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是有效的:)
如果我的正则表达式错误,请纠正我;)
归档时间: |
|
查看次数: |
68391 次 |
最近记录: |