有这么个业务需求,抽象出来如下:
根据上述需求,讨论确定了服务端下发的“某某人”采用[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 <Foundation/Foundation.h> @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]; }];
使用Objective-C处理UBB标签,布布扣,bubuko.com
原文:http://blog.csdn.net/jasonblog/article/details/26672393