Как я могу использовать NSRegularExpression для преобразования шестнадцатеричных html-объектов в десятичные html-объекты в текстовой строке с использованием Objective-C на iOS?

Как этот метод, то есть enumerateMatchesInString, отличный от код этого вопроса?

В частности, я пытаюсь использовать NSRegularExpression, чтобы создать регулярное выражение, чтобы найти совпадения в строке. Затем для каждого такого совпадения я хотел бы заменить его модифицированной версией этого совпадения. В одной из таких ситуаций я меняю шестнадцатеричный код на десятичный в объекте HTML, например,  ; ->  ; ). У меня уже есть PHP-код, который выполняет преобразование из шестнадцатеричного в десятичное, но мне нужно написать практически такой же метод на Objective-C.

Подойдет ли для этой цели один из этих двух методов или оба?

Заранее спасибо!


person annag    schedule 16.10.2012    source источник


Ответы (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]+)\;/, категорию, которую вы связали, и функцию hex to decimal, которую я создал для выполнения нужной вам замены.

- (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);
}
person Jeffery Thomas    schedule 16.10.2012
comment
Спасибо. Я не так хорошо знаком с NSScanner и NSNotFound, но похоже, что это блок кода, который можно использовать в сочетании с enumerateMatchesInString. Имеет ли это смысл? - person annag; 17.10.2012
comment
@AG Я добавил абстрагированный код в функцию. Он предназначен для работы с ARC. - person Jeffery Thomas; 17.10.2012
comment
Итак, вы говорите, что мне не нужно использовать блок для систематического преобразования (возможно, повторяющихся) совпадений, но я могу сделать это просто с помощью функции? У меня сложилось впечатление, что функция не может быть вызвана из вызова другого метода, но, возможно, это я проявляю свое невежество. - person annag; 19.10.2012