代码之家  ›  专栏  ›  技术社区  ›  Fadly Dzil

PHP-Regex获取以字符分隔的整数值

  •  -1
  • Fadly Dzil  · 技术社区  · 7 年前

    如果我有这样一个字符串:

    TAX ID NO. 01.000.589.0.055.000 
    

    我的目标是,我想得到后面的整数 tax 短语,即 010005890055000

    到目前为止,我是这样写的

    /(tax id no)\s*[^A-Za-z0-9]?\s*\K\d+/i
    

    但这仍然不是真的,因为有时用户会这样写:

    TAX ID. 01.000.589.0.055.000 or
    TAX ID : 01.000.589.0.055.000 or
    TAX ID 01.000.589.0.055.000 or
    TAX: 01.000.589.0.055.000
    

    甚至用户也直接写入完整的整数

    TAX ID NO. 010005890055000
    

    这就是我所有的可能性:

    1. JL。印尼税务识别号010005890055000

    2. 格式化

    3. 不同的

      JL。CACING RT 007/008雅加达喀贡帖木儿13910印度尼西亚税务010005890055000

      JL。印尼税务识别号01.000.589.0.055.000

    4. 在句首

      税号:010005890055000,JL。印尼雅加达帖木儿13910卡贡卡京RT 007/008

    非常感谢你。。。

    4 回复  |  直到 7 年前
        1
  •  1
  •   ggorlen Hoàng Huy Khánh    7 年前

    看起来你唯一一致的关键字是 TAX ,这样您就可以用正则表达式抓取后面的数字(带点和破折号) ~TAX.*?\.? *?([\d\.-]+)~i ,然后去除非数字(如果需要)。下面是一个示例测试:

    $data = "JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID NO. 010005890055000
    JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID NO. 01.000.589.0.055.000
    JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX 010005890055000
    JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID 01.000.589.0.055.000
    JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID. 010005890055000
    TAX ID. 010005890055000 , JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA
    tax ID. 01.000.589.0.055.000 , JL
    TAX ID. 01.000.589.0.055.000 , JL. CACING RT 007/008 CAKUNG, JAKARTA TIMUR 13910 INDONESIA
    JL. CAKUNG CILINCING KP BARU RT 007/008 CAKUNG BARAT, CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID NO. 01.109.421.6-902.000";
    
    foreach (explode("\n", $data) as $line) {
        preg_match("~TAX.*?\.? *?([\d\.-]+)~i", $line, $m);
        echo preg_replace("~\D~", "", $m[1]) . "\n";
    }
    

    输出:

    010005890055000
    010005890055000
    010005890055000
    010005890055000
    010005890055000
    010005890055000
    010005890055000
    010005890055000
    011094216902000
    

    Try it!

        2
  •  1
  •   Amit Joki    7 年前

    /(?:tax\s*(?:id\s*)?).*?(\d[\d\.]+)/i

    第一组检查 tax id . $1

    Regexr

        3
  •  1
  •   Andreas    7 年前

    您可以使用preg_replace删除除数字以外的所有内容。

    preg_replace('/[^\d]/', '', $str);
    

    见输出: https://3v4l.org/Ne3fo


    使用substr和STRPO删除“tax”之前的零件。

    $arr = ["TAX ID. 01.000.589.0.055.000 or",
    "TAX ID : 01.000.589.0.055.000 or",
    "TAX ID 01.000.589.0.055.000 or",
    "TAX: 01.000.589.0.055.000",
    "ARU RT 007/008 CAKUNG BARAT, CAKUNG, JAKARTA TIMUR 13910 INDONESIA TAX ID NO. 010005890055000"];
    
    foreach($arr as $str){
        echo preg_replace('/[^\d]/', '', substr($str, stripos($str, "tax"))) . "\n";
    }
    

    https://3v4l.org/btDAq

        4
  •  1
  •   Pushpesh Kumar Rajwanshi    7 年前

    你们可以使用这个正则表达式,除了税务部分,我把所有介于税务和数字之间的东西都做为可选的。使用此正则表达式并捕获group1

    /tax(?:.*?)\s+([\d.]+)/i
    

    Demo

    一旦得到数字和点部分,就从中删除所有点字符。

    下面是一个php代码示例,

    $arr = ["TAX ID NO. 01.000.589.0.055.000","TAX ID. 01.000.589.0.055.000","TAX ID : 01.000.589.0.055.000","TAX ID 01.000.589.0.055.000","TAX: 01.000.589.0.055.000", "TAX ID NO. 010005890055000"];
    
    foreach ($arr as &$value) {
        preg_match('/tax(?:.*?)\s+([\d.]+)/i', $value, $matches);
        echo $value . " --> " . preg_replace('/\./','',$matches[1]) . "\n";
    }
    

    TAX ID NO. 01.000.589.0.055.000 --> 010005890055000
    TAX ID. 01.000.589.0.055.000 --> 010005890055000
    TAX ID : 01.000.589.0.055.000 --> 010005890055000
    TAX ID 01.000.589.0.055.000 --> 010005890055000
    TAX: 01.000.589.0.055.000 --> 010005890055000
    TAX ID NO. 010005890055000 --> 010005890055000
    
    推荐文章