Iphone NSRegularExpression验证URL
我在一个网站上找到了这个正则表达式。据说这是最好的URL验证表达式,我同意。迭戈·佩里尼创造了它 我面临的问题是,当尝试将它与Iphone NSRegularExpression验证URL,iphone,objective-c,regex,Iphone,Objective C,Regex,我在一个网站上找到了这个正则表达式。据说这是最好的URL验证表达式,我同意。迭戈·佩里尼创造了它 我面临的问题是,当尝试将它与objective-C结合使用以检测字符串上的URL时。我尝试过使用诸如NSRegularExpressionAnchorsMatchLines、NSRegularExpressionIgnoreMetacharacters等选项,但仍然没有成功 对于Objective-C,表达式的格式是否不正确?我错过什么了吗?有什么想法吗 我也尝试过John Gruber的正则表达式
objective-C
结合使用以检测字符串上的URL时。我尝试过使用诸如NSRegularExpressionAnchorsMatchLines
、NSRegularExpressionIgnoreMetacharacters
等选项,但仍然没有成功
对于Objective-C
,表达式的格式是否不正确?我错过什么了吗?有什么想法吗
我也尝试过John Gruber的正则表达式,但由于一些无效的URL,它失败了
Regular Expression Explanation of expression
^ match at the beginning
//Protocol identifier
(?:
(?:https?|ftp http, https or ftp
):\\/\\/ ://
)? optional
// User:Pass authentication
(?:
^\\s+ non white spaces, 1 or more times
(?:
:^\\s* : non white spaces, 0 or more times, optionally
)?@ @
)? optional
//Private IP Addresses ?! Means DO NOT MATCH ahead. So do not match any of the following
(?:
(?!10 10 10.0.0.0 - 10.999.999.999
(?:
\\.\\d{1,3} . 1 to 3 digits, three times
){3}
)
(?!127 127 127.0.0.0 - 127.999.999.999
(?:
\\.\\d{1,3} . 1 to 3 digits, three times
){3}
)
(?!169\\.254 169.254 169.254.0.0 - 169.254.999.999
(?:
\\.\\d{1,3} . 1 to 3 digits, two times
){2}
)
(?!192\\.168 192.168 192.168.0.0 - 192.168.999.999
(?:
\\.\\d{1,3} . 1 to 3 digits, two times
){2}
)
(?!172\\. 172. 172.16.0.0 - 172.31.999.999
(?:
1[6-9] 1 followed by any number between 6 and 9
| or
2\\d 2 and any digit
| or
3[0-1] 3 followed by a 0 or 1
)
(?:
\\.\\d{1,3} . 1 to 3 digits, two times
){2}
)
//First Octet IPv4 // match these. Any non network or broadcast IPv4 address
(?:
[1-9]\\d? any number from 1 to 9 followed by an optional digit 1 - 99
| or
1\\d\\d 1 followed by any two digits 100 - 199
| or
2[01]\\d 2 followed by any 0 or 1, followed by a digit 200 - 219
| or
22[0-3] 22 followed by any number between 0 and 3 220 - 223
)
//Second and Third Octet IPv4
(?:
\\. .
(?:
1?\\d{1,2} optional 1 followed by any 1 or two digits 0 - 199
| or
2[0-4]\\d 2 followed by any number between 0 and 4, and any digit 200 - 249
| or
25[0-5] 25 followed by any numbers between 0 and 5 250 - 255
)
){2} two times
//Fourth Octet IPv4
(?:
\\. .
(?:
[1-9]\\d? any number between 1 and 9 followed by an optional digit 1 - 99
| or
1\\d\\d 1 followed by any two digits 100 - 199
| or
2[0-4]\\d 2 followed by any number between 0 and 4, and any digit 200 - 249
| or
25[0-4] 25 followed by any number between 0 and 4 250 - 254
)
)
//Host name
| or
(?:
(?:
[a-z\u00a1-\uffff0-9]+-? any letter, digit or character one or more times with optional -
)* zero or more times
[a-z\u00a1-\uffff0-9]+ any letter, digit or character one or more times
)
//Domain name
(?:
\\. .
(?:
[a-z\u00a1-\uffff0-9]+-? any letter, digit or character one or more times with optional -
)* zero or more times
[a-z\u00a1-\uffff0-9]+ any letter, digit or character one or more times
)* zero or more times
//TLD identifier
(?:
\\. .
(?:
[a-z\u00a1-\uffff]{2,} any letter, digit or character more than two times
)
)
)
//Port number
(?:
:\\d{2,5} : followed by any digit, two to five times, optionally
)?
//Resource path
(?:
\\/[^\\s]* / followed by an optional non space character, zero or more times
)? optional
$ match at the end
编辑
我想我忘了说我在下面的代码中使用了这个表达式:(部分代码)
我错过什么了吗
你错过了为你做这件事的内在因素。有一个方便的对象叫做。您创建它是为了寻找某些数据“类型”(比如说),然后要求它提供其属性
是我找到的最好的URL验证正则表达式,我的问题中对此进行了解释。它已经格式化为可在Objective-C上使用。但是,将其与NSRegularExpression
一起使用会给我带来各种各样的问题,包括我的应用程序崩溃RegexKitLite
在处理它时没有问题。我不知道这是一个大小限制还是一些标志没有设置。
我的最终代码如下所示:
//First I take the string and put every word in an array, then I match every word with the regular expression
NSArray *splitIntoWordsArray = [textToMatch componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewLineCharacterSet]];
NSMutableString *htmlString = [NSMutableString stringWithString:textToMatch];
for (NSString *theText in splitIntoWordsArray){
NSEnumerator *matchEnumerator = [theText matchEnumeratorWithRegex:theRegularExpressionString];
for (NSString *temp in matchEnumerator){
[htmlString replaceOccurrencesOfString:temp withString:[NSString stringWithFormat:@"<a href=\"%@\">%@</a>", temp, temp] options:NSLiteralSearch range:NSMakeRange(0, [htmlString length])];
}
}
[htmlString replaceOccurrencesOfString:@"\n" withString:@"<br />" options:NSLiteralSearch range:NSMakeRange(0, htmlString.length)];
//embed the text on a webView as HTML
[webView loadHTMLString:[NSString stringWithFormat:embedHTML, [mainFont fontName], [mainFont pointSize], htmlString] baseURL:nil];
希望这对将来的人有帮助
正则表达式有时会导致应用程序挂起,因此我决定使用gruber的正则表达式修改以识别不带协议或www部分的url:
(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/?)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))*(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’])*)
(a)以下以下:::{{1,3}[a-z0-10-10-9%[a-z0-10-9%[a-z0-10-9%[a-z0-10-9-9%[a-10.5.以下::,(a)两个(a-a-a-a-z[a-a-z[[a-a-z[[[[a-a-z[[[[[a-a-z[[[a-z[[[[[[[a-a-a-a-z[[[[[[[[[[[[[a-a-a-a-z[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[w-[w[w[w-[w-[w-[[[[[[[[[[[[[[[[[[[[[[[[[[w-[^\\s`!()\\[\]{};:'\'',«»'''.'')*)
感谢Dave的快速回答。我以前尝试过,但它无法识别某些URL,如.asia、.info等。这就是URL格式不正确的原因。这就是我使用正则表达式的原因。使用在线测试仪,它可以通过协议部分检测healthyhomes.asia或info.info。2017更新:刚刚检查了NSData探测器。
info.info
现在可以工作了,但是healthyhomes.asia
仍然不能工作。www.google.c
可以工作。不知道Safari(iOS和桌面)是如何工作的如果Foundation
的NSDataDetector
不支持这样的URL,则可以访问healthyhomes.asia
。您更新的gruber代码很好,但它与“google.com”不匹配-它与“google.comm”和“google.co.uk”匹配“-知道如何调整吗?老兄,非常感谢正则表达式。真是太神奇了。
//First I take the string and put every word in an array, then I match every word with the regular expression
NSArray *splitIntoWordsArray = [textToMatch componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewLineCharacterSet]];
NSMutableString *htmlString = [NSMutableString stringWithString:textToMatch];
for (NSString *theText in splitIntoWordsArray){
NSEnumerator *matchEnumerator = [theText matchEnumeratorWithRegex:theRegularExpressionString];
for (NSString *temp in matchEnumerator){
[htmlString replaceOccurrencesOfString:temp withString:[NSString stringWithFormat:@"<a href=\"%@\">%@</a>", temp, temp] options:NSLiteralSearch range:NSMakeRange(0, [htmlString length])];
}
}
[htmlString replaceOccurrencesOfString:@"\n" withString:@"<br />" options:NSLiteralSearch range:NSMakeRange(0, htmlString.length)];
//embed the text on a webView as HTML
[webView loadHTMLString:[NSString stringWithFormat:embedHTML, [mainFont fontName], [mainFont pointSize], htmlString] baseURL:nil];
NSError *error = NULL;
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"(?i)(?:(?:https?):\\/\\/)?(?:\\S+(?::\\S*)?@)?(?:(?:[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]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?" options:NSRegularExpressionCaseInsensitive error:&error];
if (error)
NSLog(@"error");
NSString *someString = @"This is a sample of a sentence with a URL http://. http://.. http://../ http://? http://?? http://??/ http://# http://-error-.invalid/ http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com within it.";
NSRange range = [expression rangeOfFirstMatchInString:someString options:NSMatchingCompleted range:NSMakeRange(0, [someString length])];
if (!NSEqualRanges(range, NSMakeRange(NSNotFound, 0))){
NSString *match = [someString substringWithRange:range];
NSLog(@"%@", match);
}
else {
NSLog(@"no match");
}
(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/?)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))*(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’])*)