美文网首页
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 修改需要转义的字符串

    除Json字符串外,常用的特殊字符串处理。 特殊情况举例 当我要向H5发送数据时: 此时会发生JavaScript...

  • str常用操作

    字符串引号 转义字符 序列通用功能 改 .replace(不会修改之前的字符串) 修改前面3个'ha'改成'he'...

  • 将HTML字符串解析为html样式--dangerouslySe

    使用如下的标签可以将含有标签的字符串转义显示: 其中details为需要转义的字符串

  • Python中raw字符串与多行字符串

    用'r'表示这是一个raw字符串,字符串里需要转义的字符不用刻意添加‘\’来表示。但是‘和“依旧要通过\来转义''...

  • day003 笔记

    字符串 字符串是使用' 或 "括起来的内容。 转义字符 阻止转义 可以通过在字符串前加r或R来阻止转义字符转义。实...

  • day-4(字符串总结)

    字符串 一.字符串的元素 1.1阻止转义 在字符串的最后可以添加r/R来阻止字符串中的转义字符串转义。 例如 2....

  • PHP知识点

    字符串 在使用单引号字符串时,需要转义的只有反斜杠和单引号本身。 双引号字符转义序列: 如"\110"和"\x48...

  • Python3 符号 和 关键字

    关键字 数据类型 字符串转义序列 对于字符串转义序列,需要在字符串中应用它们,确保自己清楚地知道它们的功能 运算符

  • 如何在kotlin中使用$字符串而不是转义符

    如何在kotlin中使用$字符串而不是转义符 如果你需要在原始字符串中表示字面值$字符(它不支持反斜杠转义),你可...

  • SyntaxError: (unicode error) 'un

    错误代码: 错误原因: 文件路径有问题,在字符串中\是被当作转义字符来使用的 修改:

网友评论

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

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