顯示「某用戶做了某事」,用戶名可修改,歷史文案需同步更新。服務端下發 UBB 標籤格式:[UserId]uid[/UserId],客戶端解析替換為當前暱稱。
// v1: 僅匹配內容,遺漏方括號 NSString *reStr = [NSString stringWithFormat:@"[%@].*[/%@]", tag, tag]; // v2: 嘗試轉義,但 .* 貪婪匹配 reStr = [NSString stringWithFormat:@"\[%@\].*[/%@\]", tag, tag]; // v3: 雙重轉義修正 reStr = [NSString stringWithFormat:@"\\[%@\\].*\\[/%@\\]", tag, tag]; // v4: 惰性匹配修正貪婪(多標籤場景) reStr = [NSString stringWithFormat:@"\\[%@\\].*?\\[/%@\\]", tag, tag];
NSMutableString+UBBParser@interface NSMutableString (UBBParser)
- (void)enumUBBTag:(NSString *)tag
usingBlock:(void (^)(NSRange tagRange, NSString *content,
NSMutableString *currentStr, BOOL *stop))block;
@end
NSRegularExpression 迭代匹配tagRange(整個標籤範圍)、content(uid 內容)、currentStr(可直接修改)、stop(提前終止)NSArray enumerateObjectsUsingBlock: 設計風格[displayString enumUBBTag:@"UserId" usingBlock:^(NSRange range, NSString *uid,
NSMutableString *str, BOOL *stop) {
NSString *currentName = [UserManager currentDisplayNameForUID:uid];
if (currentName.length == 0) currentName = uid; // 兜底顯示 uid
[str replaceCharactersInRange:range withString:currentName];
}];
[/UserId]),解析器應嚴格匹配最內層。NSRegularExpression 應快取重用,避免重複編譯。