关于搜索的一个问题

在项目中做搜索会碰到这样一个问题:你输入字母e,会模糊搜索出很多结果,比如“enter”,“empty”等,里面包含字母e,我们很容易就可以实现高亮字母e,但是结果中如果有中文,比如“这”,“者”,他们的拼音也包含字母e,那么怎么做到高亮结果呢?

方法如下(比如输入了搜索字符searchText : e, 其中一个结果是:“到这里来”):

  1. 首先将搜索字符searchText转拼音(因为输入的可能是中文,这里统一将结果转为大写的拼音字母来判断,不单独判断),
  2. 将查询的结果进行遍历,取出查询结果的每个字符,取出“到”;
  3. 将“到”转为拼音“DAO”,判断“DAO”是否包含搜索字符searchText,如果包含,那么“到”高亮,否则不用高亮;或者搜索字符包含了“DAO”,也高亮,否则不高亮(这里看是否有这个需求)
    3.将所有判断的结果都依次组装到一个可变富文本字符串retStr中;

代码如下:

/**
 @param orgText 搜索得到的结果
 @param searchText 搜索输入的问题本
 @param font 字体大小
 @param orgColor 默认字体颜色
 @param highColor 高亮字体颜色
 @return 可变字符串
 */
- (NSAttributedString *)generalSearchHighColorTextWithText:(NSString *)orgText
                                                searchText:(NSString *)searchText
                                                      font:(UIFont *)font
                                              orgTextColor:(UIColor *)orgColor
                                                 highColor:(UIColor *)highColor
{
    NSMutableAttributedString *retStr = [[NSMutableAttributedString alloc] init];
    NSString *nameItem = nil;
    NSString *nameItemPinYi = nil;
    NSAttributedString *nameItemAStr = nil;
    
    UIColor *retColor = nil;
   NSString *searchT = [searchText fullSpellPinYinName];//fullSpellPinYinName 为中文转拼音的分类方法
    for (NSInteger i = 0; i < orgText.length; ++i)
    {
        nameItem = [orgText substringWithRange:NSMakeRange(i, 1)];
        nameItemPinYi = [nameItem fullSpellPinYinName];
        if (nameItemPinYi.length > 0)
        {
            if (nameItemPinYi.length >= searchT.length)
            {
                if ([nameItemPinYi containsString:searchT])
                {
                    retColor = highColor;
                }
                else
                {
                    retColor = orgColor;
                }
            }
            else
            {
                if ([searchT containsString:nameItemPinYi]){
                    retColor = highColor;
                }
                else
                {
                    retColor = orgColor;
                }
            }
        }
        else
        {
            retColor = orgColor;
        }
        //genaralAttributeStringWith 是用文字,字体,颜色生成富文本的分类方法
        nameItemAStr = [UILabel genaralAttributeStringWith:nameItem font:font color:retColor];
        [retStr appendAttributedString:nameItemAStr];
    }
    
    return retStr;
}

总的来说,这里就是讨论中文结果的拼音中含有输入的字符串,该如何高亮这个中文文本。

推荐阅读更多精彩内容

  • 公司:慧友冠源科技有限公司 【日精进打卡第122天】 【知~学习】 早晨诵读: 《六项精进》大纲2遍 《六项精进通...
    江阳水阅读 41评论 0 0
  • ……
    SodnGierdi阅读 98评论 0 1
  • 文/杨艳红 一、原来荷花竟如此美丽 “原来荷花竟如此美丽!” 那个清晨,晨练结束,带着儿子来到福禄东苑的荷塘。荷塘...
    红尘独旅阅读 251评论 4 7
  • 三十多的人,大概是没有资格说什么找自我,活出自己的模样了吧。因为身背几种无法摆脱的角色,妻子、母亲、媳妇、女儿、职...
    yetigu阅读 107评论 0 0