php 正则求助

@Ta 2020-10-21发布,2020-10-21修改 1742点击
虎绿林的各位大佬求助一个php正则表达式
先来一个例子说明一下:
00000000(户号)河南省河南市河南区000(门牌号)号姓名关系性别身份证号
比如000000001河南省河南市河南区001号张信哲户主男0000000000000000(身份证号)

怎么能在这一串中提取到户号(一定是8位数字) 门牌号(一定是3位数字)姓名关系直接提取成一个,后期人工除错,性别不用获取,获取身份证号,正则表达式怎么写啊

加几个明显的东西,户号一定在最前,所有户号后面是同一个固定的中文字符,所有门牌号前面是同一个字符,后面是同一个字符,身份证号一定在最后,但是前面的字符不固定,必须是18位,但是可能漏位一17位
回复列表(18)
  • yao
    @Ta / 2020-10-21

    感觉不难,但是我不会
    http://www.1kmb.com

  • @Ta / 2020-10-21
    #(\d{8})[\w\W]+#
    
    你好!ICAC,请配合我们调查。
  • @Ta / 2020-10-21
    没有分隔符,人工有时候都分不清吧。如:

    00000001河南省河南市河南区001号欧阳外孙子男0000000000000000

    到底是哪个呢

    ·欧阳,外孙子
    ·欧阳外,孙子
    ·欧阳外孙,子
  • yao
    @Ta / 2020-10-21

    @无名啊,所以这就是考验真正技术的时候了
    http://www.1kmb.com

  • @Ta / 2020-10-21
    @无名啊,不怕有错,只要错误尽量少就行了,后期人工查错
  • @Ta / 2020-10-21
    @无期徒刑,能解释一下这个吗
  • @Ta / 2020-10-21

    @蓝猫淘气,解释不了,你看三楼,你的问题描述不够详细
    你好!ICAC,请配合我们调查。

  • @Ta / 2020-10-21
    @无期徒刑,刚才重新加了锚点,我哪里说的不够详细,我在补充一下
  • @Ta / 2020-10-21
    var pattern = /(\d{8}).*?(\d{3})号{0,1}(.*?)(户主|长子|长女|次子|次女|三子三女|子女|孙)([男|女])(\d{15,})/
    str = '000000001河南省河南市河南区001号张信哲户主男0000000000000000';
    console.log(str.match(pattern));
    


    2020-10-21 204607.png
  • @Ta / 2020-10-21
    加的锚点不在痛点上,要是有“姓名(锚点)关系”就好了,或者“关系”有固定列表

    咋还能随意加锚点啊,原数据是结构化的?
  • @Ta / 2020-10-21
    @无名啊,不是,本来就存在,刚开始没表达出来
  • @Ta / 2020-10-21

    参考了《GB/T 4761家庭关系代码》,把里面的关系抽出来,允许任意个关系组合(如三子四女)

    <?php
    
    $relations = '本人|户主|配偶|夫|妻|子|独生子|长子|次子|三子|四子|五子|养子|继子|女婿|其他儿子|女|独生女|长女|次女|三女|四女|五女|养女|继女|儿媳|其他女儿|孙子|孙女|外孙子|外孙女|孙媳妇|外孙媳妇|孙女婿|外孙女婿|曾孙子|外曾孙子|曾孙女|外曾孙女|其他孙子|其他孙女|其他外孙女|其他外孙女|父母|父亲|母亲|公公|婆婆|岳父|岳母|继父|养父|继母|养母|其他父母关系|祖父母|外祖父母|祖父|祖母|外祖父|外祖母|配偶的祖父母|配偶的外祖父母|曾祖父|曾祖母|配偶的曾祖父母|配偶的外曾祖父母|其他祖父母关系|其他外祖父母关系|兄弟姐妹|兄|嫂|弟|弟媳|姐姐|姐夫|妹妹|妹夫|其他兄弟姐妹|其他|伯父|伯母|叔父|婶母|舅父|舅母|姨父|姨母|姑父|姑母|堂兄弟|堂姐妹|表兄弟|表姐妹|侄子|侄女|外甥|外甥女|其他亲属|非亲属';
    $patten = "^(\d{8}).+(\d{3})号(.+?)(($relations)+)(男|女)(\d{16,17}[\dxX])$";
    $str = '00000001河南省河南市河南区001号张信哲三子三女男12345678901234567X';
    
    if (preg_match("/$patten/", $str, $matches)) {
        echo "户 号:$matches[1]\n";
        echo "门 牌:$matches[2]\n";
        echo "姓 名:$matches[3]\n";
        echo "关 系:$matches[4]\n";
        echo "性 别:$matches[6]\n";
        echo "身份证:$matches[7]\n";
    }
    
    

    结果:

    户 号:00000001
    门 牌:001
    姓 名:张信哲
    关 系:三子三女
    性 别:男
    身份证:12345678901234567X

  • @Ta / 2020-10-21
    @无名啊,大佬,代码我试过了,问题完美解决,感谢,赠人玫瑰,手留余香,祝你前程似锦,未来可期
  • @Ta / 2020-10-21
    @石头会飞翔,感谢,问题已经解决
  • @Ta / 2020-10-21
    @无名啊,大佬,我在多问一句,在关系和性别之间可能有也可能没有嘈杂字符,目前会导致匹配失败,应该怎么处理能忽略这可能有也可能没有的嘈杂字符,刚才试着加了一个.?.问题解决了
  • @Ta / 2020-10-21
    不是大佬,还不完美啊喂,记得人工检查啊

    我那至少还有俩毛病:

    1.“名字”某些结尾,会被计入“关系”中
    若 名字结尾处,含有“关系列表”里的某一项,会被计入“关系”中(如“赵钱子户主”会算作“赵钱”“子户主”)

    2.关系不在“关系列表”中会失败
    如“三子六女”
  • @Ta / 2020-10-21

    嘈杂字符?

    $patten = "(\d{8}).+(\d{3})号(.+?)(($relations)+).*?(男|女)(\d{16,17}[\dxX])";
    $str = '00000001河南省河南市河南区001号张信哲三子三女【嘈杂字符】男12345678901234567X';
    
  • @Ta / 2020-10-21
    @无名啊,这两个问题我会通过精简关系列表和人工查错解决,你描述的嘈杂字符是对的。我加了个.?,然后会跳过了,虽然我不知道.?是干什么的
添加新回复
回复需要登录

[聊天-公共聊天室] o:@寻梦xunm,催更ᥬ᭄