效果图
功能
1. 将英文字母当做全拼匹配中文
2. 将英文字母当做拼音首字母匹配中文
3. 中英数字特殊字符混合匹配
Demo
实现思路
近日,需要为App的搜索功能添加快速匹配列表,具体需求如下:
- 输入英文字母匹配对应英文
例如 输入a 匹配到 ask中的a 将a变色- 输入中文匹配中文
- 输入英文字母匹配对应中文首字母
例如输入sk 匹配到 失控 时刻 时空- 输入英文匹配对应中文全拼 (划重点)
例如输入 ih 可以匹配到 帝豪(dihao) 你好(nihao)- 混合匹配下基本正确(允许出现少许问题)
解决需求
1:直接调用rangeofstring方法得到需要变色区域即可
2:先将双方字符串统一大小后,rangeofstring得到变色区域即可
3:
-
将源字符串的中文转为拼音
NSMutableString *pinyin = [chinese mutableCopy]; CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO); CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
-
取得其首字母
[[pinyin substringWithRange:NSMakeRange(0, 1)] uppercaseString];
rangeofstring得到变色区域
4:
-
得到源字符串转换的全拼字符串
你好,少年 nihao,shaonian
生成源字符串和全拼字符串的对应关系字典
如图得到的字典如下
@{
0:[0,1],//你 ni
1:[2,3,4],//好 hao
2:[5],//
3:[6,7,8,9],//少 shao
4:[10,11,12,13] //年
};
-
获得输入的字母在全拼字符串中的位置 (例如输入为ih)
[@"nihao,shaonian" rangeOfString:@"ih"]; 根据range得出位置为1,2
-
利用得出的位置匹配上述字典的值
1 位于 0:[0,1]中 则得到对应源字符串位置 --> 0(你) 2 位于 1:[2,3,4]中 则得到对应源字符串位置 --> 1(好) 生成源字符串对应的range
利用得出的源字符串的range变色即可
5:因为在需求4的解决方案中对应的特殊字符也写入了全拼字符串,则已经可以解决此需求
其中遭遇的坑
-
CFStringTransform得到中文的拼音
你会发现"沈沈"被识别为“chenchen”
”女“被识别为”nu“,这个是因为其转为的拼音带了声调符,在去掉声调符的时
上的两点也被去掉了 所以就变成了u,所以这个bug运用系统的转换是无法解决的,只能等待系统更新 直接使用3的时候会出现 如果文本为“的到都”,搜索文字为“都”时,会将“的到都”都匹配到,因为运用了首字母匹配,所有在搜索文字仅仅为中文时,不能启用首字母匹配,混合的时候出现此种情况暂时无法避免。