首先,我无法控制我得到的文字.只是想把它放在那里所以你知道我不能改变链接.
我试图在使用NSDataDetector中找到链接的文本包含以下内容:
<h1>My main item</h1>
<img src="http://www.blah.com/My First Image Here.jpg">
<h2>Some extra data</h2>
Run Code Online (Sandbox Code Playgroud)
我正在使用的检测代码是这样,但它找不到这个链接:
NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray *matches = [linkDetector matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])];
for (NSTextCheckingResult *match in matches)
{
if ([match resultType] == NSTextCheckingTypeLink)
{
NSURL *url = [match URL];
// does some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这是Apple的链接检测错误,它无法检测带空格的链接,或者我做错了什么?
有没有人有更可靠的方法来检测链接,无论它们是否有空格或特殊字符或其中的任何内容?
我能解释这个问题最简单的方法是使用代码示例及其输出,但实质上发生的NSDataDetector是检测字符串中包含"电话号码"字样的电话号码.
NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
error:&error];
NSArray *stringsToTest = @[
@"testing phone number 0123 4567891",
@"testing some other number 0123 4567892",
@"phone number 0123 4567893",
@"blah blah 0123 4567894",
@"testing telephone number 0123 4567895"
];
for (NSString *string in stringsToTest)
{
[dataDetector enumerateMatchesInString:string
options:0
range:NSMakeRange(0, string.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"%@", result.phoneNumber);
}];
}
Run Code Online (Sandbox Code Playgroud)
输出:
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567891
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567892
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] …Run Code Online (Sandbox Code Playgroud) 我试图从UNKNOWN格式的NSString中获取NSDate ,所以我写了一个类似下面的函数
-(void)dateFromString:(NSString*)string {
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error];
NSArray *matches = [detector matchesInString:string
options:0
range:NSMakeRange(0, [string length])];
NSLocale* currentLoc = [NSLocale currentLocale];
for (NSTextCheckingResult *match in matches) {
if ([match resultType] == NSTextCheckingTypeDate) {
NSLog(@"Date : %@", [[match date] descriptionWithLocale:currentLoc]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了一个地方外,它运作良好.
如果我调用
[self dateFromString:@"6/12"];
Run Code Online (Sandbox Code Playgroud)
它打印
日期:2014年6月12日,星期四,澳大利亚东部标准时间下午12:00:00
如果我打电话的话
[self dateFromString:@"13/12"];
Run Code Online (Sandbox Code Playgroud)
它打印
日期:2013年12月13日星期五下午12:00:00澳大利亚东部夏令时间
基本上,我希望函数表现一致.由于我住在澳大利亚,它应该在12月6日返回首次执行.第二次通话结果是正确的.
我在这做错了什么?
假设今天是2014年1月20日.如果我使用NSDataDetector从字符串"明天下午4点"中提取日期,我将得到2014-01-21T16:00.大.
但是,假设我希望NSDataDetector 假装当前日期是2014年1月14日.这样,当我解析"明天下午4点"时,我会得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?
谢谢.
我有一个来自服务器的字符串,想检查它是否包含电话号码,邮件地址和电子邮件等表达式.我在电话号码和邮件地址方面取得了成功,但没有收到电子邮件.我是NSDataDetector为了这个目的而使用的.例如
NSString *string = sourceNode.label; //coming from server
//Phone number
NSDataDetector *phoneDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:nil];
NSArray *phoneMatches = [phoneDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in phoneMatches) {
if ([match resultType] == NSTextCheckingTypePhoneNumber) {
NSString *matchingStringPhone = [match description];
NSLog(@"found URL: %@", matchingStringPhone);
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何为电子邮件做同样的事情呢?
我一直在使用NSDataDetector解析字符串的地址,并且大部分它做得很好.然而,在地址'类似于这个地方它没有检测到它.
6200 North Evan Blvd Suit 487 Highland UT 84043
目前我正在使用此代码:
NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:&error];
NSArray *matches = [detector matchesInString:output options:0 range:NSMakeRange(0, [output length])];
for (NSTextCheckingResult *match in matches) {
if ([match resultType] == NSTextCheckingTypeAddress) {
_address = [_tesseractData substringWithRange:[match range]];
NSDictionary *data = [match addressComponents];
_zip = [data objectForKey:@"ZIP"];
if (_zip) {
NSRange zipRange = [_tesseractData rangeOfString:_zip];
if (zipRange.location != NSNotFound) {
[_tesseractData deleteCharactersInRange:zipRange];
}
}
_city = [data objectForKey:@"City"];
if …Run Code Online (Sandbox Code Playgroud) 在iOS中有一个名为的类NSDataDetector,例如,让你传递一个文本,它将检测该文本是否包含邮政地址,日期,链接......
就我而言,我有兴趣为Android找到一个类似的工具,它可以检测文本中的地址.我一直在玩Geocoder,但它只有在你已经知道地址的情况下才有效.否则,它不会达到目的.
我正在寻找的一个例子可能是:
鉴于:
This is just a sample text that contains a nice address: 123 W Main St, Imaginary City, IC, 12345
该工具只会返回123 W Main St, Imaginary City, IC, 12345
请记住,地址可能有不同的格式.
提前致谢!
我正在尝试使用NSDataDetector字符串中的地址.我已经看过NSHipster的文章NSDataDetector以及Apple的NSDataDetector文档.我有以下方法,它将从字符串中提取地址:
func getAddress(from dataString: String) -> [String] {
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue)
let matches = detector.matches(in: dataString, options: [], range: NSRange(location: 0, length: dataString.utf16.count))
var addressArray = [String]()
// put matches into array of Strings
for match in matches {
let address = (dataString as NSString).substring(with: match.range)
addressArray.append(address)
}
return addressArray
}
Run Code Online (Sandbox Code Playgroud)
我想提取地址的元素,而不是整个地址.在NSHipster的NSDataDetector帖子在数据检测器的匹配类型中,我看到的地址组件,如NSTextCheckingCityKey,NSTextCheckingStateKey和NSTextCheckingZIPKey.我无法在NSDataDetector初始化中使用这些键.
我在GitHub上挖了一下,看看我是否能找到一个来自crib的例子,但我能找到的唯一东西是主Swift回购中的Objective-C代码或声明性东西.
我99%肯定我可以拿出一个地址的各个组成部分,但我太愚蠢了,无法弄明白.谢谢你的阅读.我欢迎建议.
我正在使用以下代码来检测字符串中的电子邮件.除了处理具有纯数字前缀的电子邮件,例如"536264846@gmail.com"之外,它工作正常.是否有可能克服苹果的这个错误?任何帮助将不胜感激!
NSString *string = @"536264846@gmail.com";
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
NSArray *matches = [detector matchesInString:string
options:0
range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches) {
if ([match.URL.scheme isEqualToString:@"mailto"]) {
NSString *email = [match.URL.absoluteString substringFromIndex:match.URL.scheme.length + 1];
NSLog(@"email :%@",email);
}else{
NSLog(@"[match URL] :%@",[match URL]);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:日志结果为:[匹配网址]:http://gmail.com