Замените смайлы изображениями в NSAttributedString - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть список Emoji сущностей, и у каждого из них есть свойство codes, и я хочу проверить строку ("]:-)"), если она содержит какую-либо из них, а затем заменить улыбку изображением.

for (Emoji *emoji in self.emojis) {
    for (NSString *code in emoji.codes) {
        NSString *pattern = [NSRegularExpression escapedPatternForString:code];
        NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];

        NSArray *matches = [regex matchesInString:[sourceString string] options:0 range:NSMakeRange(0, [sourceString length])];

        [matches enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSTextCheckingResult * _Nonnull aResult, NSUInteger idx, BOOL * _Nonnull stop) {
            NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
            [attachment setImage:[UIImage imageNamed:emoji.image]];

            NSAttributedString *replacement = [NSAttributedString attributedStringWithAttachment:attachment];
            [sourceString replaceCharactersInRange:[aResult range] withAttributedString:replacement];
        }];
    }
}

Проблема в том, что smile с кодом ]:-) содержит :-), и мой метод заменяет его следующим: скобка ] + [image] для :-), потому что :-) идет первым в списке.

Как я могу проверить точную строку?

Я пробовал: ]:-/), \\b]:-/)\\b, /^]:-/)$/

Может быть, есть лучшее решение, чтобы заставить это работать.

1 Ответ

0 голосов
/ 07 сентября 2018

Если я правильно понял вашу нынешнюю структуру:

@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSArray *codes;
@end

Возможное решение - использовать одну пару значений: imageName / code

@interface Emoji : NSObject
@property (nonatomic, strong) NSString *image; //I'd expect a UIImage there and not an image name
@property (nonatomic, strong) NSString *code;
@end

self.emojis будет иметь множество объектов Emoji, которые могут иметь одно и то же имя изображения для другого кода, но преимущество в этом заключается в следующем маленьком приеме:
Сортируйте self.emojis таким образом, чтобы «меньшие» смайлики были в конце. Таким образом, вы замените сначала только «длинные» и меньшие.

self.emojis = [arrayOfSingleEmojis sortedArrayUsingComparator:^NSComparisonResult(Emoji * _Nonnull emoji1, Emoji * _Nonnull emoji2) {
    NSUInteger length1 = [[emoji1 code] length];
    NSUInteger length2 = [[emoji2 code] length];
    return [@(length2) compare:@(length1)]; //Or reverse length1 & length2, I never know, I always have to test, but I think it's the correct one
}];

Итак, в вашем текущем случае: ]:-) будет заменен до :-), поэтому вы должны иметь <imageFor:">:-)"] вместо ]<imageFor:":-)>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...