前言
oc字符串替換一般使用系統提供的%@、%d、%u等,但是有的時候根據需求我們需要自定義佔位符,如下:
我們上報服務器數據時,需要向Facebook的渠道做一個轉發,eventName
是轉發的事件名稱,其中${level}
是需要解析本地數據level
,如level
= 10,則eventName
是爲trackleveldone_10
.
//此數據是服務器下發給SDK的,告訴SDK轉發的渠道、事件名稱。
{
"channel":"Facebook",
"eventName":"trackleveldone_${params.level}"
}
同時,一個字符串中,可能存在多個${}
,如:${params.name}_trackleveldone_${params.level}
、${params.name}_tracklevel_${params.coin}_done_${params.level}
等等。
實現
- 首先獲取,要替換的字符串。
//查找要替換的屬性
-(NSArray *) findReplaceHold:(NSString *)holdString {
if (![holdString isKindOfClass: [NSString class]]) {
return nil;
}
//保存要替換的字符串
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];
BOOL flag = TRUE;
while (flag) {
//查詢"${}"
NSRange startRange = [holdString rangeOfString:@"${"];
NSRange endRange = [holdString rangeOfString:@"}"];
//只有兩個都匹配,才裁剪,否則表示沒有匹配的了。
if (startRange.location == NSNotFound || endRange.location == NSNotFound) {
flag = FALSE;
return array;
}
//得出${}包圍的字符串
NSRange sliceRange = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
if ((startRange.location + startRange.length >= holdString.length) || (endRange.location - startRange.location - startRange.length >= holdString.length)) {
flag = FALSE;
return nil;
}
//獲取${}包圍的字符串
NSString* content = [holdString substringWithRange:sliceRange];
if (![content isKindOfClass:[NSString class]]) {
flag = FALSE;
return nil;
}
[array addObject:content];
//去掉${}的內容
if (startRange.location >= holdString.length) {
flag = FALSE;
return nil;
}
NSString* startContent = [holdString substringWithRange:NSMakeRange(0,startRange.location)];
if ((endRange.location + endRange.length >= holdString.length) ||
holdString.length - endRange.location - endRange.length >= holdString.length) {
//表示”}“後邊沒有數據了
holdString = startContent;
continue;
}
NSString* endContent = [holdString substringWithRange:NSMakeRange(endRange.location + endRange.length, holdString.length - endRange.location - endRange.length)];
//組裝數據,"${"前 + "}"後
holdString = [NSString stringWithFormat:@"%@%@",startContent,endContent];
}
return array;
}
- 獲取到替換的字符串後,對此字符串做替換
//查找要替換的屬性,replaceValue是key即是上邊查到的字符串,value是要替換的值。
-(NSString *) replaceHold:(NSString *)holdString replaceValue:(NSDictionary *)replaceValue {
if (![holdString isKindOfClass: [NSString class]] || ![replaceValue isKindOfClass:[NSDictionary class]]) {
return nil;
}
BOOL flag = TRUE;
while (flag) {
//查詢"${ }"
NSRange startRange = [holdString rangeOfString:@"${"];
NSRange endRange = [holdString rangeOfString:@"}"];
if (startRange.location == NSNotFound || endRange.location == NSNotFound) {
flag = FALSE;
return holdString;
}
//得出${}包圍的字符串
NSRange sliceRange = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
//獲取${}包圍的字符串
NSString* content = [holdString substringWithRange:sliceRange];
if (![content isKindOfClass:[NSString class]]) {
flag = FALSE;
return nil;
}
//去掉${}的內容
if (startRange.location >= holdString.length) {
flag = FALSE;
return nil;
}
NSString* startContent = [holdString substringWithRange:NSMakeRange(0,startRange.location)];
if ((endRange.location + endRange.length >= holdString.length) ||
holdString.length - endRange.location - endRange.length >= holdString.length) {
//組裝數據,"${"前 + 中
holdString = [NSString stringWithFormat:@"%@%@",startContent,replaceValue[content]];
continue;
}
NSString* endContent = [holdString substringWithRange:NSMakeRange(endRange.location + endRange.length, holdString.length - endRange.location - endRange.length)];
//組裝數據,"${"前 + 中 + "}"後
holdString = [NSString stringWithFormat:@"%@%@%@",startContent,replaceValue[content],endContent];
}
return holdString;
}
- 使用方式
//1.獲取要替換的字符串
NSArray* keyArray = [self findReplaceHold:eventName];
//2. 根據keyArray 去獲取程序中對應的value
NSMutableDictionary* keyDict = [self findKeyValue: keyArray];
//3.替換字符串
NSString* finalEventName = [self replaceHold:eventName replaceValue:keyDict];