前言
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];