有這麼個業務需求,抽象出來如下:
展示一條文案,比如“某某人做了某某事”,這裡的“某某人”是一個用戶的昵稱;用戶可以修改昵稱,修改過後再看之前的文案,“某某人”這個昵稱需要跟著變化;文案數據從服務端獲取;根據上述需求,討論確定了服務端下發的“某某人”采用[UserId]uid[/UserId]這樣的UBB標簽格式,客戶端進行解析和替換。
要解析內容,首先要匹配指定的UBB標簽,一種簡單粗暴的方案就是先查找第一個[UserId],再查找第一個[/UserId],定位到匹配內容。
為了代碼好看點,也可以采用正則表達式匹配。第一個版本如下:
NSString *reStr = [NSString stringWithFormat:@"[%@].*[/%@]", ubbTag, ubbTag];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL]; NSString *reStr = [NSString stringWithFormat:@"\[%@].*?[/%@\]", ubbTag, ubbTag];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL]; NSString *reStr = [NSString stringWithFormat:@"\\[%@\\].*\\[/%@\\]", ubbTag, ubbTag];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL]; NSString *reStr = [NSString stringWithFormat:@"\\[%@\\].*?\\[/%@\\]", ubbTag, ubbTag];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL];#import@interface NSMutableString (UBBParser) - (void)enumUBBTag:(NSString *)ubbTag usingBlock:(void (^)(NSRange tagRange, NSString *tagContent, NSMutableString *currentStr, BOOL *stop))block; @end
[string enumUBBTag:@"UserId" usingBlock:^(NSRange tagRange, NSString *tagContent, NSMutableString *currentStr, BOOL *stop) {
NSString *currentDisplayName = ...
if (currentDisplayName.length == 0) currentDisplayName = tagContent;
[currentStr replaceCharactersInRange:tagRange withString:currentDisplayName];
}];