需求:改变后台传过来的字符串中某几个字符的字体颜色,类似于以下图片效果,改变5 和 0/5的字体颜色。
一、解决思路
- 第一种方法:后台分隔字符串,通过多个字符串拼接起来(后台增加字段过多,不是很好)
- 第二种方法:后台只返回整个字符串和需要改变颜色的数组(字段少了,比第一种方式好)
- 第三种方法:前端这边写一个正则,后端那边字符串需要改变颜色的问题用特殊字符包裹
二、实现(前两种就不讲了,第三种)
1.先通过正则移除掉后台获取的文字里面的特殊字符得到一个最终显示的字符stringA
2.再通过正则得到需要改变颜色的数组字符串stringArr
3.通过字符串改变数组字符串的颜色
第一步
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<p>|</p>)" options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators | NSRegularExpressionAnchorsMatchLines | NSRegularExpressionAllowCommentsAndWhitespace error:&error];
NSString *result = [regex stringByReplacingMatchesInString:self options:0 range:NSMakeRange(0, [self length]) withTemplate:@""];
第二步
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regular options:0 error:&error];
NSArray *matches = [regularExpression matchesInString:self options:0 range:NSMakeRange(0, self.length)];
NSMutableArray *array = [NSMutableArray array];
for (NSTextCheckingResult *match in matches) {
NSRange matchRange = [match range];
NSString *a = [self substringWithRange:matchRange];
[array addObject:a];
}
第三步
NSMutableAttributedString *nameString = [[NSMutableAttributedString alloc]initWithString:self];
for (int i = 0; i < self.length; i++) {
for (NSString *item in itemArr) {
NSString *str = [self substringWithRange:NSMakeRange(i, item.length)];
if ([item isEqualToString:str]) {
[nameString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(i, item.length)];
i = i + (int)(item.length) - 1;
}
}
}
三、总结
我们后台的规则定的是需要改变颜色的字符串是以<p>XX</p>包裹的,所以正则里面的那个都可以换成您们和后台约定的,然后这些方法可以写一个字符串类别,注入到你的工具类中使用。
我用的正则是这个:
(?<=\\<p>).*?(?=\\<\\/p>)
分为3部分(?<=\\<p>) && .*? && (?=\\<\\/p>)
第一部分左边的这都是固定的(?<= ,因为< 特殊字符所以前面加一个\\
中间部分代表你改变颜色的内容
右边部分左边的也固定(?=,< 、/特殊字符所以前面加一个\\