使用NSRegularExpression自動識別電話號碼

最近項(xiàng)目中碰到了這樣一個(gè)需求,需要在一段文字中識別出手機(jī)號,并加上特殊顏色呐赡,和點(diǎn)擊事件。下面說下我的思路骏融,拋磚引玉链嘀。(如果你有更好的想法,不妨交流下)

前提是基于TTTAttributedLabel實(shí)現(xiàn)的档玻。因?yàn)門TTAttributedLabel已經(jīng)做了添加鏈接怀泊,我們目的是找出應(yīng)該在哪里加鏈接,關(guān)于怎么加上误趴,以及點(diǎn)擊鏈接的代理事件不是本文重點(diǎn)霹琼。工欲善其事,必先利其器嗎凉当。(以下內(nèi)容僅以國內(nèi)固話和手機(jī)號為例碧囊,不涉及國外電話)

思路

主要分為兩步,

  1. 先粗略找出字符串中可能為固話和手機(jī)號的子字符串及其在該字符串中的位置range纤怒。
    什么是可能為電話號碼的字符串糯而,比如18000000000(連續(xù)11位數(shù)字),010-66666666(3位區(qū)號-8位號碼)還有(3-7泊窘,4-8熄驼,4-7)以及區(qū)號和號碼之間不用“-”的像寒,這些都是有可能為電話號碼的。
    用正則表達(dá)式表示就是

     #define PHONEREGULAR @"\\d{3,4}[- ]?\\d{7,8}"http://匹配10到12位連續(xù)數(shù)字瓜贾,或者帶連字符/空格的固話號诺祸,空格和連字符可以省略。
    

關(guān)于正則表達(dá)式這里有篇30分鐘入門教程
核心代碼實(shí)現(xiàn)

    self.ddLabel.text = tempStr;

    NSRange stringRange = NSMakeRange(0, tempStr.length);
    //正則匹配
    NSError *error;
    NSRegularExpression *regexps = [NSRegularExpression regularExpressionWithPattern:PHONEREGULAR options:0 error:&error];
    if (!error && regexps != nil) {
        [regexps enumerateMatchesInString:[tempStr string] options:0 range:stringRange usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
        
            //可能為電話號碼的字符串及其所在位置
            NSString *actionString = [NSString stringWithFormat:@"%@",[self.ddLabel.text substringWithRange:result.range]];
            NSRange phoneRange = result.range;
            //這里需要判斷是否是電話號碼祭芦,并添加鏈接
            if ([DDUtil isMobilePhoneOrtelePhone:actionString]) {
              [self.ddLabel addLinkToPhoneNumber:actionString withRange:result.range];
            
            }
        }];
    }
  1. 當(dāng)然只判斷這些肯定是不夠的筷笨,像這種20899999999,很明顯不是電話號龟劲,上面也匹配了胃夏。我們第二步就是篩選是手機(jī)號的并加上鏈接。這里我直接用了我們項(xiàng)目里的工具類昌跌,這個(gè)代碼網(wǎng)上一搜一堆仰禀,不再介紹。
    主要代碼實(shí)現(xiàn)
 *  // 驗(yàn)證是固話或者手機(jī)號
 *
 *  @param mobileNum 手機(jī)號
 *
 *  @return 是否
 */
+ (BOOL)isMobilePhoneOrtelePhone:(NSString *)mobileNum {
    if (mobileNum==nil || mobileNum.length ==0) {
        return NO;
    }
    /**
     * 手機(jī)號碼
     * 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 聯(lián)通:130,131,132,152,155,156,185,186
     * 電信:133,1349,153,180,189
     */
    NSString * MOBILE = @"^((13)|(14)|(15)|(17)|(18))\\d{9}$";// @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
    /**
     10         * 中國移動:China Mobile
     11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     12         */
    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     15         * 中國聯(lián)通:China Unicom
     16         * 130,131,132,152,155,156,185,186
     17         */
    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     20         * 中國電信:China Telecom
     21         * 133,1349,153,180,189
     22         */
    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    /**
     25         * 大陸地區(qū)固話及小靈通
     26         * 區(qū)號:010,020,021,022,023,024,025,027,028,029
     27         * 號碼:七位或八位
     28         */
    NSString * PHS = @"^((0\\d{2,3}-?)\\d{7,8}(-\\d{2,5})?)$";// @"^0(10|2[0-5789]-|\\d{3})\\d{7,8}$";
    
    NSPredicate *regextestPHS = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", PHS];
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    
    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES)
        || ([regextestPHS evaluateWithObject:mobileNum]==YES)) {
        return YES;
    }
    else{
        return NO;
    }
}

效果圖

1.png

源代碼

源碼

注意

沒有做沒加區(qū)號的號碼匹配蚕愤,其實(shí)我們項(xiàng)目里面只做手機(jī)號就行了答恶。感興趣的可以自己加。當(dāng)然對這些特殊的110萍诱,120悬嗓,也不會支持。這個(gè)在我們項(xiàng)目里根本是錄不進(jìn)去的裕坊,因?yàn)樽隽藝?yán)格的輸入限制包竹,只能輸11位手機(jī)號。作為展示碍庵,肯定不會有110,120悟狱,這種無聊的數(shù)據(jù)的静浴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挤渐,隨后出現(xiàn)的幾起案子苹享,更是在濱河造成了極大的恐慌,老刑警劉巖浴麻,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件得问,死亡現(xiàn)場離奇詭異,居然都是意外死亡软免,警方通過查閱死者的電腦和手機(jī)宫纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏萧,“玉大人漓骚,你說我怎么就攤上這事蝌衔。” “怎么了蝌蹂?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵噩斟,是天一觀的道長。 經(jīng)常有香客問我孤个,道長剃允,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任齐鲤,我火速辦了婚禮斥废,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佳遂。我一直安慰自己营袜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布丑罪。 她就那樣靜靜地躺著荚板,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吩屹。 梳的紋絲不亂的頭發(fā)上跪另,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音煤搜,去河邊找鬼免绿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛擦盾,可吹牛的內(nèi)容都是我干的嘲驾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼迹卢,長吁一口氣:“原來是場噩夢啊……” “哼辽故!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腐碱,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤誊垢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后症见,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喂走,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年谋作,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芋肠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遵蚜,死狀恐怖业栅,靈堂內(nèi)的尸體忽然破棺而出秒咐,到底是詐尸還是另有隱情,我是刑警寧澤碘裕,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布携取,位于F島的核電站,受9級特大地震影響帮孔,放射性物質(zhì)發(fā)生泄漏雷滋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一文兢、第九天 我趴在偏房一處隱蔽的房頂上張望晤斩。 院中可真熱鬧,春花似錦姆坚、人聲如沸澳泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔辅。三九已至,卻和暖如春击喂,著一層夾襖步出監(jiān)牢的瞬間维苔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工懂昂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留介时,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓凌彬,卻偏偏與公主長得像沸柔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子铲敛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫褐澎、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,060評論 4 62
  • 參考文章 正則表達(dá)式30分鐘入門教程 學(xué)習(xí)之前 學(xué)習(xí)之前原探,先安裝一個(gè)Mac上用的軟件乱凿,來測試你的正則表達(dá)式是否正確...
    劉大帥閱讀 3,739評論 2 36
  • 前幾天發(fā)現(xiàn)一個(gè)公共號顽素,有一百多篇文章咽弦,每一篇都是以作者自己敘述身邊小故事的方式來寫的,但是卻絲毫不會讓人覺得反感胁出。...
    小明媳婦06閱讀 324評論 0 0
  • 記得小學(xué)一年級的時(shí)候型型,真正意義上關(guān)注你是運(yùn)動會上你上臺領(lǐng)獎(jiǎng),那時(shí)候覺得怎么會有長得這么高的人全蝶,后來彼此慢慢熟絡(luò)起來...
    南馭閱讀 337評論 6 6
  • 堅(jiān)持,說出來如此容易的詞绷落,為什么實(shí)際做的時(shí)候卻那么的難呢姥闪? 實(shí)際上堅(jiān)持不了太長時(shí)間只是你太傲嬌了而已啦。 曾經(jīng)的某...
    大司馬與少司命閱讀 393評論 0 0