【iOS】查找字符串的位置,或多关键词标红

2021-08-05  本文已影响0人  irenb

一、查找子字符串在父字符串中的位置

NSString *string = @"美国苹果公司";
NSString *substring = @"苹果";
// rangeOfString: 默认只返回第一个关键字的位置
NSRange range = [string rangeOfString:substring];
NSString *string = @"美国苹果公司苹果手机";
NSString *substring = @"苹果";
// 有多个关键词
NSArray *rangeArr = [self br_substringRange:substring ofString:string];
for (NSValue *rangeValue in rangeArr) {
    NSRange range = [rangeValue rangeValue];
   // [attributedString addAttribute:NSForegroundColorAttributeName value:keywordColor range:range];
}


#pragma mark - 方法1:查找 substring 在 string 中的位置范围
- (NSArray *)br_substringRange:(NSString *)substring ofString:(NSString *)string {
    NSMutableArray *rangeArr = [[NSMutableArray alloc]init];
    NSString *tempString = string;
    NSInteger count = 0;
    while ([tempString containsString:substring]) {
        NSRange range = [tempString rangeOfString:substring];
        tempString = [tempString stringByReplacingCharactersInRange:range withString:@""];
        
        range = NSMakeRange(range.location + substring.length * count, range.length);
        [rangeArr addObject:[NSValue valueWithRange:range]];
        
        count++;
    }
    return [rangeArr copy];
}

#pragma mark - 方法2:查找 substring 在 string 中的位置范围
- (NSArray *)br_substringRange:(NSString *)substring ofString:(NSString *)string {
    NSMutableArray *rangeArr = [[NSMutableArray alloc]init];
    for (NSInteger i = 0; i < string.length - substring.length + 1; i++) {
        NSString *findString = [string substringWithRange:NSMakeRange(i, substring.length)];
        if ([findString isEqualToString:substring]) {
            NSRange range = NSMakeRange(i, substring.length);
            [rangeArr addObject:[NSValue valueWithRange:range]];
        }
    }
    return [rangeArr copy];
}

二、多关键词标红

#pragma mark - 设置文本关键词红色显示
// 公司名称:美国<em>苹果</em>科技<em>公司</em>
- (NSAttributedString *)br_setTextKeywords:(UIColor *)keywordColor {
    NSString *formatText = nil;
    NSMutableAttributedString *attributedString = nil;
    if ([self br_containsString:@"<em>"]) {
        formatText = [[self stringByReplacingOccurrencesOfString:@"<em>" withString:@""] stringByReplacingOccurrencesOfString:@"</em>" withString:@""];
        attributedString = [[NSMutableAttributedString alloc] initWithString:formatText];
        
        NSString *tempString = self;
        while ([tempString br_containsString:@"<em>"]) {
            // 第一个关键词的位置
            NSRange headRange = [tempString rangeOfString:@"<em>"];
            NSRange footRange = [tempString rangeOfString:@"</em>"];
            NSInteger keywordLocation = headRange.location;
            NSInteger keywordLength = footRange.location - (headRange.location + headRange.length);
            NSRange keywordRange = NSMakeRange(keywordLocation, keywordLength);
            [attributedString addAttribute:NSForegroundColorAttributeName value:keywordColor range:keywordRange];

            tempString = [tempString stringByReplacingCharactersInRange:footRange withString:@""];
            tempString = [tempString stringByReplacingCharactersInRange:headRange withString:@""];
        }
    } else {
        formatText = self;
        attributedString = [[NSMutableAttributedString alloc] initWithString:formatText];
    }
    
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    // 段落行间距
    paragraphStyle.lineSpacing = 5.0f;
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; // 显示不完整,尾部显示省略号
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [formatText length])];
    
    return [attributedString copy];
}
上一篇 下一篇

猜你喜欢

热点阅读