iOS中常用的正則驗證

@interface ZhengZeObject : NSObject

// 驗證各大運營商電話號段
+ (BOOL)isMatchedByRegex:(NSString *)mobileNum;

// 判斷輸入的是否是手機號
+ (BOOL)isValidPhoneNumber:(NSString *)phoneNumber;

// 判斷輸入的郵箱格式是否正確
+ (BOOL)isValidEmail:(NSString *)email;

// 判斷輸入的身份證格式和合法性是否正確
+ (BOOL)isValidCardNumber:(NSString *)identityCard;

// 判斷輸入的車牌號格式是否正確
+ (BOOL)isValidCarID:(NSString *)carID;

// 判斷輸入6~16位數(shù)字/字母/下劃線組成的密碼格式是否正確
+ (BOOL)isValidPassword:(NSString *)password;

// 判斷輸入字符串是否全為[(數(shù)字)OR(數(shù)字|字母)OR(字母)OR(漢字)]
+ (BOOL)isValidAlltype:(NSString *)oneType;

// 判斷輸入字符串是否全為[(數(shù)字)OR(數(shù)字|字母)OR(字母)OR(漢字)]
+ (BOOL)isValidBankCard:(NSString *)bankCard;

// 正則去除網(wǎng)絡(luò)標簽
+ (NSString *)getInnerTextWithHTMLString:(NSString *)string;

// 驗證各大運營商電話號段
+ (BOOL)isMatchedByRegex:(NSString *)mobileNum {
    /**
     * 是否是移動號
     * 中國移動:China Mobile
     * 134[0-8],13[5-9],147,15[0-2],15[7-9],170[3|5|6],178,18[2-4],18[7-8]
     */
    NSString *CM = @"^1(34[0-8]|70[356]|(3[5-9]|4[7]|5[0-27-9]|7[8]|8[2-47-8])\\d)\\d{7}$";
    /**
     * 是否是聯(lián)通號
     * 中國聯(lián)通:China Unicom
     * 13[0-2],145,15[5-6],17[5-6],18[5-6],170[4|7|8|9],171
     */
    NSString *CU = @"^1(70[07-9]|(3[0-2]|4[5]|5[5-6]|7[15-6]|8[5-6])\\d)\\d{7}$";
    /**
     * 是否是電信號
     * 中國電信:China Telecom
     * 133,1349,149,153,173,177,180,181,189,170[0-2]
     */
    NSString *CT = @"^1(34[9]|70[0-2]|(3[3]|4[9]|5[3]|7[37]|8[019])\\d)\\d{7}$";
    /**
     * 大陸地區(qū)固話及小靈通
     * 區(qū)號:010,020,021,022,023,024,025,027,028,029
     * 號碼:七位或八位
     */
    NSString *MT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";

    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    NSPredicate *regextestmt = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MT];

    if (([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestmt evaluateWithObject:mobileNum] == YES)) {
        return YES;
    }else{
        return NO;
    }

// 判斷輸入的是否是手機號
/**
 手機號碼 13[0-9],14[5|7|9],15[0-3],15[5-9],17[0|1|3|5|6|8],18[0-9]
 移動:134[0-8],13[5-9],147,15[0-2],15[7-9],178,18[2-4],18[7-8]
 聯(lián)通:13[0-2],145,15[5-6],17[5-6],18[5-6]
 電信:133,1349,149,153,173,177,180,181,189
 虛擬運營商: 170[0-2]電信  170[3|5|6]移動 170[4|7|8|9],171 聯(lián)通
 上網(wǎng)卡又稱數(shù)據(jù)卡糕珊,14號段為上網(wǎng)卡專屬號段蝶缀,中國聯(lián)通上網(wǎng)卡號段為145,中國移動上網(wǎng)卡號段為147佩脊,中國電信上網(wǎng)卡號段為149
 */
+ (BOOL)isValidPhoneNumber:(NSString *)mobileNum {
    NSString * phoneRegex  = @"^1(3[0-9]|4[579]|5[0-35-9]|7[01356]|8[0-9])\\d{8}$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
    BOOL isMatch = [pred evaluateWithObject:mobileNum];
    return isMatch;
}

+ (BOOL)isValidCardNumber:(NSString *)value {
    value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    long length = 0;

    if (!value) {
        return false;
    } else {
        length = value.length;
        if (length != 15 && length != 18) {
            return false;
        }
    }
    // 省份代碼
    NSArray *areasArray =@[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41", @"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];

    NSString *valueStart2 = [value substringToIndex:2];
    BOOL areaFlag = FALSE;
    for (NSString *areaCode in areasArray) {
        if ([areaCode isEqualToString:valueStart2]) {
            areaFlag = YES;
            break;
        }
    }

    if (!areaFlag) {
        return false;
    }

    NSRegularExpression *regularExpression;
    NSUInteger numberofMatch;

    int year = 0;
    switch (length) {
        case 15:
            year = [value substringWithRange:NSMakeRange(6,2)].intValue + 1900;
            if (year % 4 == 0 || (year % 100 == 0 && year % 4 == 0)) {

                regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];//測試出生日期的合法性
            }else {
                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];//測試出生日期的合法性
            }
            numberofMatch = [regularExpression numberOfMatchesInString:value
                                                               options:NSMatchingReportProgress
                                                                 range:NSMakeRange(0, value.length)];

            if(numberofMatch >0) {
                return YES;
            }else {
                return NO;
            }
        case 18:
            year = [value substringWithRange:NSMakeRange(6,4)].intValue;
            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) { 
                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];//測試出生日期的合法性
            }else {
                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:nil];//測試出生日期的合法性
            }
            numberofMatch = [regularExpression numberOfMatchesInString:value
                                                               options:NSMatchingReportProgress
                                                                 range:NSMakeRange(0, value.length)];

            if(numberofMatch > 0) {
                int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
                int Y = S %11;
                NSString *M = @"F";
                NSString *JYM = @"10X98765432";
                M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判斷校驗位
                if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {
                    return YES;// 檢測ID的校驗位
                }else {
                    return NO;
                }
            }else {
                return NO;
            }
        default:
            return false;
    }
}


+ (BOOL)isValidEmail:(NSString *)email {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailTest evaluateWithObject:email];
}

+ (BOOL)isValidCarID:(NSString *)carID {
    if (carID.length!=7) {
        return NO;
    }
    NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-hj-zA-HJ-Z]{1}[a-hj-zA-HJ-Z_0-9]{4}[a-hj-zA-HJ-Z_0-9_\u4e00-\u9fa5]$";
    NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];
    return [carTest evaluateWithObject:carID];

    return YES;
}

+ (BOOL)isValidPassword:(NSString *)password {
    NSString * pattern  =   @"^[A-Za-z0-9_]{6,16}$";
    //    NSString *condition =@"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,16}";
    NSPredicate * pred  =   [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern];
    return [pred evaluateWithObject:password];
}

+ (BOOL)isValidAlltype:(NSString *)oneType {
    NSString *condition = @"^[0-9]*$"; //是否都是數(shù)字
    //    NSString *condition = @"^[A-Za-z]+$"; //是否都是字母
    //    NSString *condition = @"^[A-Za-z0-9]+$"; //是否都是字母和數(shù)字{6,16}
    //    NSString *condition = @"^[A-Za-z0-9]{6,16}$"; //是否都是字母和數(shù)字且長度在[6,16]
    //    NSString *condition = @"^[\u4e00-\u9fa5]{0,}$"; //只能輸入漢字
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",condition];
    return [predicate evaluateWithObject:oneType];
}

+ (BOOL)isValidBankCard:(NSString *)bankCard {
    if (bankCard.length < 16) {
        return NO;
    }
    NSInteger oddsum = 0;     //奇數(shù)求和
    NSInteger evensum = 0;    //偶數(shù)求和
    NSInteger allsum = 0;
    NSInteger cardNoLength = (NSInteger)[bankCard length];
    // 取了最后一位數(shù)
    NSInteger lastNum = [[bankCard substringFromIndex:cardNoLength-1] intValue];
    //測試的是除了最后一位數(shù)外的其他數(shù)字
    bankCard = [bankCard substringToIndex:cardNoLength - 1];
    for (NSInteger i = cardNoLength -1 ; i>=1;i--) {
        NSString *tmpString = [bankCard substringWithRange:NSMakeRange(i-1, 1)];
        NSInteger tmpVal = [tmpString integerValue];
        if (cardNoLength % 2 ==1 ) {//卡號位數(shù)為奇數(shù)
            if((i % 2) == 0){//偶數(shù)位置
                tmpVal *= 2;
                if(tmpVal>=10)
                    tmpVal -= 9;
                evensum += tmpVal;
            }else{//奇數(shù)位置
                oddsum += tmpVal;
            }
        }else{
            if((i % 2) == 1){
                tmpVal *= 2;
                if(tmpVal>=10)
                    tmpVal -= 9;
                evensum += tmpVal;
            }else{
                oddsum += tmpVal;
            }
        }
    }

    allsum = oddsum + evensum;
    allsum += lastNum;
    if((allsum % 10) == 0)
        return YES;
    else
        return NO;
}

// 正則去除網(wǎng)絡(luò)標簽
+ (NSString *)getInnerTextWithHTMLString:(NSString *)string{
    NSRegularExpression * regularExpretion = [NSRegularExpression regularExpressionWithPattern:@"<[^>]*>|\n|&nbsp" options:0 error:nil];
    string = [regularExpretion stringByReplacingMatchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, string.length) withTemplate:@""];
    return string;
}

附:

>1、校驗密碼強度
密碼的強度必須包含大小寫字母和數(shù)字的組合,不能使用特殊字符蝇狼,長度在8-10之間
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

密碼至少包含一個數(shù)字嫁怀,一個字母和一個特殊字符
 ^(?=.*)(?=.*[a-z])(?=.*[~!@#$%^&*:;,.=?$\x22]).{8,16}$


>2、校驗中文
字符串只能是中文
^[\\u4e00-\\u9fa5]{0,}$

>3购笆、由數(shù)字,26個英文字母或下劃線組成的字符串
^\\w+$

>4、校驗E-Mail 地址
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?

>5诉儒、校驗身份證號碼
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

>6、校驗日期
“yyyy-mm-dd“ 格式的日期校驗亏掀,已考慮平閏年
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

>7忱反、校驗金額
金額校驗,精確到2位小數(shù)
^[0-9]+(.[0-9]{2})?$

>8滤愕、校驗手機號
^1(3[0-9]|4[579]|5[0-35-9]|7[01356]|8[0-9])\\d{8}$

>9温算、判斷IE的版本
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

>10、校驗IP-v4地址
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

>11间影、校驗IP-v6地址
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

>12注竿、檢查URL的前綴
if (!s.match(/^[a-zA-Z]+:\\/\\//)){
   s = 'http://' + s;}

>13、提取URL鏈接
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

>14、文件路徑及擴展名校驗
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

>15巩割、提取Color Hex  Codes
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

>16裙顽、提取網(wǎng)頁圖片
\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

>17、提取頁面超鏈接
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

>18喂分、查找CSS屬性
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

>19锦庸、抽取注釋
<!--(.*?)-->

>20、匹配HTML標簽
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>

>21.校驗基本日期格式
var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒲祈,一起剝皮案震驚了整個濱河市甘萧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梆掸,老刑警劉巖扬卷,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酸钦,居然都是意外死亡怪得,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門卑硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徒恋,“玉大人,你說我怎么就攤上這事欢伏∪胝酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵硝拧,是天一觀的道長径筏。 經(jīng)常有香客問我,道長障陶,這世上最難降的妖魔是什么滋恬? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮抱究,結(jié)果婚禮上恢氯,老公的妹妹穿的比我還像新娘。我一直安慰自己媳维,他們只是感情好酿雪,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侄刽,像睡著了一般指黎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上州丹,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天醋安,我揣著相機與錄音杂彭,去河邊找鬼。 笑死吓揪,一個胖子當著我的面吹牛亲怠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柠辞,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼团秽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叭首?” 一聲冷哼從身側(cè)響起习勤,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焙格,沒想到半個月后图毕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡眷唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年予颤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬阳。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛤虐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肝陪,到底是詐尸還是另有隱情笆焰,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布见坑,位于F島的核電站,受9級特大地震影響捏检,放射性物質(zhì)發(fā)生泄漏荞驴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一贯城、第九天 我趴在偏房一處隱蔽的房頂上張望熊楼。 院中可真熱鬧,春花似錦能犯、人聲如沸鲫骗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽执泰。三九已至,卻和暖如春渡蜻,著一層夾襖步出監(jiān)牢的瞬間术吝,已是汗流浹背计济。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留排苍,地道東北人沦寂。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像淘衙,于是被迫代替她去往敵國和親传藏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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