程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 使用Objective

使用Objective

編輯:關於C

有這麼個業務需求,抽象出來如下:

展示一條文案,比如“某某人做了某某事”,這裡的“某某人”是一個用戶的昵稱;用戶可以修改昵稱,修改過後再看之前的文案,“某某人”這個昵稱需要跟著變化;文案數據從服務端獲取;

根據上述需求,討論確定了服務端下發的“某某人”采用[UserId]uid[/UserId]這樣的UBB標簽格式,客戶端進行解析和替換。

要解析內容,首先要匹配指定的UBB標簽,一種簡單粗暴的方案就是先查找第一個[UserId],再查找第一個[/UserId],定位到匹配內容。

為了代碼好看點,也可以采用正則表達式匹配。第一個版本如下:

    NSString *reStr = [NSString stringWithFormat:@"[%@].*[/%@]", ubbTag, ubbTag];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL];

這個版本只能匹配 "UserId]uid[/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];

這樣就OK了,能匹配到完整的內容。不過當出現多個[UserId]標簽時,會貪婪匹配,所以有了第四個版本,進行懶惰匹配:

    NSString *reStr = [NSString stringWithFormat:@"\\[%@\\].*?\\[/%@\\]", ubbTag, ubbTag];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reStr options:0 error:NULL];

當可以准確匹配到UBB標簽內容時,就可以對其進行處理了:

#import 

@interface NSMutableString (UBBParser)

- (void)enumUBBTag:(NSString *)ubbTag usingBlock:(void (^)(NSRange tagRange,
                                                           NSString *tagContent,
                                                           NSMutableString *currentStr,
                                                           BOOL *stop))block;

@end

這裡基於NSMutableString做了下擴展,參考NSArray的枚舉回調接口提供了上述這麼一個接口,具體實現可以參考這裡的Gist。

    [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];
    }];

上面是處理的調用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved