iOS 搜索結(jié)果關(guān)鍵字變色

效果圖

未命名.gif

功能

1. 將英文字母當(dāng)做全拼匹配中文
2. 將英文字母當(dāng)做拼音首字母匹配中文
3. 中英數(shù)字特殊字符混合匹配

Demo

實(shí)現(xiàn)思路

近日风题,需要為App的搜索功能添加快速匹配列表腹纳,具體需求如下:

  1. 輸入英文字母匹配對應(yīng)英文
    例如 輸入a 匹配到 ask中的a 將a變色
  2. 輸入中文匹配中文
  3. 輸入英文字母匹配對應(yīng)中文首字母
    例如輸入sk 匹配到 失控 時(shí)刻 時(shí)空
  4. 輸入英文匹配對應(yīng)中文全拼 (劃重點(diǎn))
    例如輸入 ih 可以匹配到 帝豪(dihao) 你好(nihao)
  5. 混合匹配下基本正確(允許出現(xiàn)少許問題)

解決需求

1:直接調(diào)用rangeofstring方法得到需要變色區(qū)域即可
2:先將雙方字符串統(tǒng)一大小后甘耿,rangeofstring得到變色區(qū)域即可
3:

  • 將源字符串的中文轉(zhuǎn)為拼音

      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得到變色區(qū)域

4:

  • 得到源字符串轉(zhuǎn)換的全拼字符串

    你好授瘦,少年      
    nihao,shaonian
    
  • 生成源字符串和全拼字符串的對應(yīng)關(guān)系字典

94001D19-7FC7-4A9A-A68E-BE75663A436B.png

如圖得到的字典如下

@{
    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"];
    根據(jù)range得出位置為1,2
    
  • 利用得出的位置匹配上述字典的值

     1 位于 0:[0,1]中 則得到對應(yīng)源字符串位置 --> 0(你)
     2 位于 1:[2,3,4]中 則得到對應(yīng)源字符串位置 --> 1(好)
     生成源字符串對應(yīng)的range
    
  • 利用得出的源字符串的range變色即可

5:因?yàn)樵谛枨?的解決方案中對應(yīng)的特殊字符也寫入了全拼字符串质礼,則已經(jīng)可以解決此需求

其中遭遇的坑

  • CFStringTransform得到中文的拼音
    你會(huì)發(fā)現(xiàn)"沈沈"被識(shí)別為“chenchen”
    ”女“被識(shí)別為”nu“鲫骗,這個(gè)是因?yàn)槠滢D(zhuǎn)為的拼音帶了聲調(diào)符,在去掉聲調(diào)符的時(shí)

    E5AB04DB-47DD-4A84-820F-DA8EE6667642.png

    上的兩點(diǎn)也被去掉了 所以就變成了u杠人,所以這個(gè)bug運(yùn)用系統(tǒng)的轉(zhuǎn)換是無法解決的勋乾,只能等待系統(tǒng)更新

  • 直接使用3的時(shí)候會(huì)出現(xiàn) 如果文本為“的到都”,搜索文字為“都”時(shí)嗡善,會(huì)將“的到都”都匹配到辑莫,因?yàn)檫\(yùn)用了首字母匹配,所有在搜索文字僅僅為中文時(shí)罩引,不能啟用首字母匹配各吨,混合的時(shí)候出現(xiàn)此種情況暫時(shí)無法避免。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜒程,一起剝皮案震驚了整個(gè)濱河市绅你,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昭躺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伪嫁,死亡現(xiàn)場離奇詭異领炫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)张咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門帝洪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脚猾,你說我怎么就攤上這事葱峡。” “怎么了龙助?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵砰奕,是天一觀的道長。 經(jīng)常有香客問我提鸟,道長军援,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任称勋,我火速辦了婚禮胸哥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡鲜。我一直安慰自己空厌,他們只是感情好庐船,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘲更,像睡著了一般筐钟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哮内,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天盗棵,我揣著相機(jī)與錄音,去河邊找鬼北发。 笑死纹因,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琳拨。 我是一名探鬼主播瞭恰,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狱庇!你這毒婦竟也來了惊畏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤密任,失蹤者是張志新(化名)和其女友劉穎颜启,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪讳,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缰盏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淹遵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口猜。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖透揣,靈堂內(nèi)的尸體忽然破棺而出济炎,到底是詐尸還是另有隱情,我是刑警寧澤辐真,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布须尚,位于F島的核電站,受9級(jí)特大地震影響拆祈,放射性物質(zhì)發(fā)生泄漏恨闪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一放坏、第九天 我趴在偏房一處隱蔽的房頂上張望咙咽。 院中可真熱鬧,春花似錦淤年、人聲如沸钧敞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溉苛。三九已至镜廉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愚战,已是汗流浹背娇唯。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寂玲,地道東北人塔插。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像拓哟,于是被迫代替她去往敵國和親想许。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容