【问题标题】:How can I use an NSRegularExpression to convert hexadecimal html entities to decimal html entities in a string of text, using Objective-C on iOS?如何使用 NSRegularExpression 在 iOS 上使用 Objective-C 将十六进制 html 实体转换为文本字符串中的十进制 html 实体?
【发布时间】:2012-10-06 23:02:53
【问题描述】:

this method怎么样 也就是enumerateMatchesInString,不同于this question's code

更具体地说,我正在尝试使用 NSRegularExpression 来制作正则表达式,以在字符串中查找匹配项。然后,对于每个这样的匹配,我想用该匹配的修改版本替换它。在一种这样的情况下,我将 HTML 实体中的十六进制更改为十进制,例如 ; -> ; )。我已经有解决从十六进制到十进制转换的 PHP 代码,但我需要在 Objective-C 中编写基本相同的方法。

这两种方法中的任何一种或两种都适用于该目的吗?

提前谢谢你!

【问题讨论】:

    标签: html ios regex objective-c-blocks nsregularexpression


    【解决方案1】:

    这应该不会太难,正则表达式是/\&\#x([0-9a-fA-F]+)\;/

    一旦您将捕获的数字包含在字符串中,您就可以使用NSScanner

    int value = NSNotFound;
    [[NSScanner scannerWithString:capturedHexString] scanHexInt:&value];
    NSString *decimalString = [NSString stringWithFormat:@"%d", value];
    

    希望对您有所帮助。


    澄清

    我将把它作为一个简单的函数提取出来

    static inline NSString *MyDecimalStringFromHexString(NSString *hexString)
    {
        unsigned value = NSNotFound;
        [[NSScanner scannerWithString:hexString] scanHexInt:&value];
    
        NSString *decimalString = nil;
    
        if (value != NSNotFound)
            decimalString = [NSString stringWithFormat:@"%d", value];
    
        return decimalString;
    }
    

    把它们放在一起

    这是一个单元测试,它使用正则表达式 /\&\#x([0-9a-fA-F]+)\;/、您链接的类别以及我创建的十六进制到十进制函数来执行您想要的替换。

    - (void)testHexEntityToDecimalEntity
    {
        NSString *input = @"This 
 is ઼ test";
        NSString *expected = @"This 
 is ઼ test";
    
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\&\\#x([0-9a-fA-F]+)\\;" options:0 error:nil];
    
        NSString *actual = [regex stringByReplacingMatchesInString:input options:0 range:NSMakeRange(0, input.length) usingBlock:^NSString *(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
            NSRange hexRange = [result rangeAtIndex:1];
            NSString *hexString = [input substringWithRange:hexRange];
            NSString *decimalString = MyDecimalStringFromHexString(hexString);
            return [NSString stringWithFormat:@"&#%@;", decimalString];
        }];
    
        STAssertEqualObjects(actual, expected, nil);
    }
    

    【讨论】:

    • 谢谢。我对 NSScanner 和 NSNotFound 不太熟悉,但看起来这是一个可以与 enumerateMatchesInString 结合使用的代码块。这有意义吗?
    • @AG 我添加了将代码抽象成一个函数。它旨在与 ARC 配合使用。
    • 那么,你的意思是我不需要使用块来系统地转换(可能重复)匹配,但可以简单地使用函数来做到这一点吗?我一直认为不能从另一个方法的调用中调用一个函数,但这可能是我表现出我的无知。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2015-04-11
    • 1970-01-01
    • 2012-04-15
    • 2012-10-13
    • 2018-08-03
    • 2011-03-29
    相关资源
    最近更新 更多