美文网首页
iOS 修改需要转义的字符串

iOS 修改需要转义的字符串

作者: 曾經蠟筆沒有小新 | 来源:发表于2021-03-04 18:56 被阅读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文本

    相关文章

      网友评论

          本文标题:iOS 修改需要转义的字符串

          本文链接:https://www.haomeiwen.com/subject/cyukqltx.html