除Json字符串外,常用的特殊字符串处理。
特殊情况举例
当我要向H5
发送数据时:
NSString *message = @"<section>'这是一段测试文字'</section>";
NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message];
[self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
} else {
NSLog(@"%@",error);
}
}];
此时会发生JavaScript
异常
是因为需要传值的字符串中和JavaScript
的中的单引号冲突,H5
无法识别,此时我们需要对这类的字符串进行转义操作。
转义
手动查找并转义
一般情况下Objective-C
里
英文单引号正常可以写成@"'"
英文双引号正常可以写成@"""
但是,普通字符串的转义是无法像JSON
那样去转义的,所以就需要替换字符串。
踩坑
找到需要转义的'
或"
,分别替换为\\'
或\\"
。
此处必须写成双反斜杠,不然编译器或者系统会认为此处是转义,会自动去掉单反斜杠。
正确的写法:
NSString *message = @"<section>\\'这是一段测试文字\\'</section>";
正确的转义打印
错误的写法:
NSString *message = @"<section>\'这是一段测试文字\'</section>";
错误的转义打印
上面是手动转义,是直接在文本上进行转义。
代码转义
普通文本中可能存在多个特殊字符,此时需要遍历字符串,查找每个字符进行匹配后修改。
NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"<section>'这是一段测试文字'</section><section>'这是一段测试文字'</section><section>'这是一段测试文字'</section>"];
// 判断message中是否包含单引号
if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString]
// 遍历所有字符串
[message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
if ([substring isEqualToString:specialString]) {
// 转义特殊字符串
[message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange];
}
}];
}
完整的示例代码:
NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"<section>'这是一段测试文字'</section><section>'这是一段测试文字'</section><section>'这是一段测试文字'</section>"];
// 判断message中是否包含单引号
if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString]
// 遍历所有字符串
[message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
if ([substring isEqualToString:specialString]) {
// 转义特殊字符串
[message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange];
}
}];
}
NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message];
[self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
} else {
NSLog(@"%@",response);
}
}];
展示最终结果
最终的js文本
网友评论