PHP-正则表达式可获取以字符分隔的整数值

时间:2018-11-20 06:21:01

标签: php regex

如果我有这样的字符串:

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。 CACING RT 007/008 JAKARTA JAKARTA TIMUR 13910印度尼西亚税号010005890055000

  2. 格式化

    JL。 CACING RT 007/008 JAKARTA JAKARTA TIMUR 13910印度尼西亚税号01.000.589.0.055.000

  3. 使用不同的tax短语

    JL。 CACING RT 007/008雅加达帖木尔CAKUNG 13910印度尼西亚税010005890055000

    JL。 CACING RT 007/008雅加达帖木尔CAKUNG 13910印尼税号01.000.589.0.055.000

    JL。 CACING RT 007/008 CAKUNG,雅加达帖木尔13910印度尼西亚税号。 010005890055000

  4. 在句子开头

    税号。 010005890055000,JL。 CACING RT 007/008印度尼西亚雅加达帖木尔13910卡孔

    税号。 01.000.589.0.055.000,JL。 CACING RT 007/008印度尼西亚雅加达帖木尔13910卡孔

非常感谢您...

4 个答案:

答案 0 :(得分:1)

您可以利用此:

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

第一组检查tax,其中id是可选的。然后,它将获取第一个数字和所有数字以及.并将其分组在$1

Regexr

答案 1 :(得分:1)

看起来您唯一的一致关键字是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)

您可以使用preg_replace除去所有数字。

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

查看输出:https://3v4l.org/Ne3fo


要回答新要求: 使用substr和strpos删除不超过“ 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

答案 3 :(得分:1)

您可以使用此正则表达式,其中TAX部分除外,我已将介于税和数字之间的所有内容设为可选。使用此正则表达式并捕获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