有這麼個業務需求,抽象出來如下:
展示一條文案,比如“某某人做了某某事”,這裡的“某某人”是一個用戶的昵稱;用戶可以修改昵稱,修改過後再看之前的文案,“某某人”這個昵稱需要跟著變化;文案數據從服務端獲取;根據上述需求,討論確定了服務端下發的“某某人”采用[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]; }];