需求:改變后臺傳過來的字符串中某幾個字符的字體顏色,類似于以下圖片效果犀农,改變5 和 0/5的字體顏色卤橄。
截屏2021-09-15 下午4.57.06.png
一室琢、解決思路
- 第一種方法:后臺分隔字符串芜壁,通過多個字符串拼接起來(后臺增加字段過多陨簇,不是很好)
- 第二種方法:后臺只返回整個字符串和需要改變顏色的數(shù)組(字段少了,比第一種方式好)
- 第三種方法:前端這邊寫一個正則彼哼,后端那邊字符串需要改變顏色的問題用特殊字符包裹
二对妄、實現(xiàn)(前兩種就不講了,第三種)
1.先通過正則移除掉后臺獲取的文字里面的特殊字符得到一個最終顯示的字符stringA
2.再通過正則得到需要改變顏色的數(shù)組字符串stringArr
3.通過字符串改變數(shù)組字符串的顏色
第一步
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;
}
}
}
三敢朱、總結
我們后臺的規(guī)則定的是需要改變顏色的字符串是以<p>XX</p>包裹的剪菱,所以正則里面的那個都可以換成您們和后臺約定的,然后這些方法可以寫一個字符串類別拴签,注入到你的工具類中使用孝常。
我用的正則是這個:
(?<=\\<p>).*?(?=\\<\\/p>)
分為3部分(?<=\\<p>) && .*? && (?=\\<\\/p>)
第一部分左邊的這都是固定的(?<= ,因為< 特殊字符所以前面加一個\\
中間部分代表你改變顏色的內容
右邊部分左邊的也固定(?=,< 蚓哩、/特殊字符所以前面加一個\\