正規表現を使用して部分文字列を検索する例を次に示します。"href=" を探し、次に href= の後の最初の引用符 (") を探します。これらのインデックスが見つかると、その間の文字列が返されます。
私の例では、正規表現は実際には必要ありません。代わりに、単純な NSString メソッドを使用して部分文字列を見つけることができます。
これは、特定のケースに適合するハードコードされた例にすぎません。実際には、DOM/XML パーサーを使用してこのようなことを行う方がよいでしょう。
また、実際の URL を抽出したいと考えており、
また、この関数は、文字列に href の一致がない場合を処理しないことに注意してください。
- (NSString *)stringByExtractingAnchorTagURLFromString:(NSString *)dom {
NSError *error;
// Find the "href=" part
NSRegularExpression *firstRegexp = [NSRegularExpression regularExpressionWithPattern:@"href=\"" options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *firstResult = [firstRegexp firstMatchInString:dom options:NSMatchingReportProgress range:NSMakeRange(0, [dom length])];
NSUInteger startIndex = firstResult.range.location + firstResult.range.length;
// Find the first quote (") character after the href=
NSRegularExpression *secondRegexp = [NSRegularExpression regularExpressionWithPattern:@"\"" options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *secondResult = [secondRegexp firstMatchInString:dom options:NSMatchingReportProgress range:NSMakeRange(startIndex, [dom length]-startIndex)];
NSUInteger endIndex = secondResult.range.location;
// The URL is the string between these two found locations
return [dom substringWithRange:NSMakeRange(startIndex, endIndex-startIndex)];
}
これは私がそれをテストした方法です:
NSString *dom = @"<div style=\"clear:both;\"></div><div style=\"float:left;\"><div style=\"float:left; height:27px; font-size:13px; padding-top:2px;\"><div style=\"float:left;\"><a href=\"http://www.hulkshare.com/ap-nxy2n2wn7ke8.mp3\" rel=\"nofollow\" target=\"_blank\" style=\"color:green;\">Download</a></div>";
NSString *result = [self stringByExtractingAnchorTagURLFromString:dom];
NSLog(@"Result: %@", result);
テスト出力:
Result: http://www.hulkshare.com/ap-nxy2n2wn7ke8.mp3
UPDATE -- 複数の HREF
複数の href の場合、この関数を使用すると、URL を保持する NSString の配列が返されます。
- (NSArray *)anchorTagURLsFromString:(NSString *)dom {
NSError *error;
NSMutableArray *urls = [NSMutableArray array];
// First find all matching hrefs in the dom
NSRegularExpression *firstRegexp = [NSRegularExpression regularExpressionWithPattern:@"href=\"" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [firstRegexp matchesInString:dom options:NSMatchingReportProgress range:NSMakeRange(0, [dom length])];
// Go through all matches and extrac the URL
for (NSTextCheckingResult *match in matches) {
NSUInteger startIndex = match.range.location + match.range.length;
// Find the first quote (") character after the href=
NSRegularExpression *secondRegexp = [NSRegularExpression regularExpressionWithPattern:@"\"" options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *secondResult = [secondRegexp firstMatchInString:dom options:NSMatchingReportProgress range:NSMakeRange(startIndex, [dom length]-startIndex)];
NSUInteger endIndex = secondResult.range.location;
[urls addObject:[dom substringWithRange:NSMakeRange(startIndex, endIndex-startIndex)]];
}
return urls;
}
これは私がそれをテストした方法です:
NSString *dom2 = @"<div style=\"clear:both;\"></div><div style=\"float:left;\"><div style=\"float:left; height:27px; font-size:13px; padding-top:2px;\"><div style=\"float:left;\"><a href=\"http://www.hulkshare.com/ap-nxy2n2wn7ke8.mp3\" rel=\"nofollow\" target=\"_blank\" style=\"color:green;\">Download</a><a href=\"http://www.google.com/blabla\" rel=\"nofollow\" target=\"_blank\" style=\"color:green;\">Download</a></div>";
NSArray *urls = [self anchorTagURLsFromString:dom2];
for (NSString *url in urls) {
NSLog(@"URL: %@", url);
}
これはテストの出力です:
URL: http://www.hulkshare.com/ap-nxy2n2wn7ke8.mp3
URL: http://www.google.com/blabla