用NSAttributedString中的图像替换微笑

问题描述 投票:-1回答:1

我有一个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];
        }];
    }
}

问题是代码]:-)的微笑包含:-)和我的方法替换为下一个:为]括号[image] + :-),这是因为:-)在列表中排名第一。

如何检查确切的字符串?

我试过了:]:-/)\\b]:-/)\\b/^]:-/)$/

也许有更好的解决方案让这个工作。

ios objective-c regex nsstring
1个回答
1
投票

如果我理解你当前的结构:

@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:":-)>

© www.soinside.com 2019 - 2024. All rights reserved.