从html文件导入书签

时间:2013-02-21 02:47:09

标签: objective-c regex parsing bookmarks nsregularexpression

我正在尝试向我的应用添加导入书签功能。我有一些但它只会提取所有的URL和标题。

- (NSArray *)urlsInHTML:(NSString *)html {
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=href=\").*?(?=\")" options:NSRegularExpressionCaseInsensitive error:&error];

    NSArray *arrayOfAllMatches = [regex matchesInString:html options:0 range:NSMakeRange(0, [html length])];

    NSMutableArray *arrayOfURLs = [[NSMutableArray alloc] init];

    for (NSTextCheckingResult *match in arrayOfAllMatches) {
        NSString* substringForMatch = [html substringWithRange:match.range];
        NSLog(@"Extracted URL: %@",substringForMatch);

        [arrayOfURLs addObject:substringForMatch];
    }

    // return non-mutable version of the array
    return [NSArray arrayWithArray:arrayOfURLs];
}

- (NSArray *)titlesOfTagsInHTML:(NSString *)html {
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"\\>)(.*?)(?=\\<\\/)" options:NSRegularExpressionCaseInsensitive error:&error];

    NSArray *arrayOfAllMatches = [regex matchesInString:html options:0 range:NSMakeRange(0, [html length])];

    NSMutableArray *arrayOfURLs = [[NSMutableArray alloc] init];

    for (NSTextCheckingResult *match in arrayOfAllMatches) {
        NSString* substringForMatch = [html substringWithRange:match.range];
        NSLog(@"Extracted Title: %@",substringForMatch);

        [arrayOfURLs addObject:substringForMatch];
    }

    // return non-mutable version of the array
    return [NSArray arrayWithArray:arrayOfURLs];
}

- (IBAction)import {

    ProgressAlertView *progressAlert = [[ProgressAlertView alloc] initWithTitle:@"Crux" message:@"Importing Bookmarks..." delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    [progressAlert show];

    NSString *htmlString = [NSString stringWithContentsOfFile:importingBookmarkFilePath encoding:NSUTF8StringEncoding error:nil];
    NSArray *urls = [self urlsInHTML:htmlString];
    NSArray *titles = [self titlesOfTagsInHTML:htmlString];
    //float progress = [[NSNumber numberWithInt:i] floatValue]/[[NSNumber numberWithInteger:[urls count]-1] floatValue];
    for (int i=0; i<[urls count]; i++) {
        Bookmark *importedBookmark = [[Bookmark alloc] init];
        importedBookmark.url = urls[i];
        importedBookmark.title = titles[i];
        [[[BookmarkManager sharedInstance] bookmarks] addObject:importedBookmark];
        [[BookmarkManager sharedInstance] saveBookmarks];
    }
}

但是我无法找到如何确定文件夹,因此我可以保持主题与其他浏览器中的主题完全一致。要查看safari如何导出它们,只需转到文件&gt;导出书签,即可看到html文件。它将所有内容放在带有文件夹标题的定义列表中。使用NSREgularExpression或其他方式,我如何获得每个文件夹标题以及该文件夹中的所有内容?

我尝试使用NSXMLParser来解析html,但是它停在第一个定义列表标记处并失败。

1 个答案:

答案 0 :(得分:1)

格式并不复杂,因此您应该能够使用NSScanner对其进行解析。一般流程将如下:

  • 向上扫描<DT>
  • 检查以下是H3还是A(文件夹或书签)
  • 相应处理
  • 重复

文件夹可以包含子文件夹,因此您需要递归创建对象。祝你好运。