iOS 修改需要转义的字符串

2021-03-04  本文已影响0人  曾經蠟筆沒有小新

除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异常

是因为需要传值的字符串中和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文本
上一篇下一篇

猜你喜欢

热点阅读