未知格式的 A-Z 和 0-9 组合的增量

Increment for combination of A-Z and 0-9 with unknown format

我得到了一个table来保存发票起始编号,它可以让用户以任何格式定义,例如:

ABC123

AZ2D20D7S99

但会强制用户以数字

结束

我得到一个 table 来保存所有创建的发票 auto_increment

所以现在,我需要用

显示发票号

发票起始编号 + auto_increment发票编号

例如,我从数据库中选择了发票 ID 11,发票编号应该是

ABC134

AZ2D20D7S110

我以为可以用preg_match和preg_replace,但是起始号码没有标准格式,所以我想除非有标准格式,否则不可能吧?

您说您强制用户以数字结尾,因此这是您可以在 RegEx 中使用的某种标准格式。

$regs = array();
$data="AZ2D20D7S110";
preg_match('/(.*?)(\d*\z)/', $data, $regs);
// use $regs[1] for matched number, increment it and append it $regs[0]

我会使用 preg_match 获取尾随号码,并使用 preg_replace 将其替换为新号码:

$autoId = 11; /* this is the auto id from the database */
$id = "ABC134"; /* this is the user input */

/* find the trailing number and store it in $number */
preg_match("/[^\d]+(\d+)$/", $id, $matches);
$number = $matches[1];

/* increase the number by the database id */
$newNumber = $number + $autoId;

/* replace the old number with the new number */
echo preg_replace("/\d+$/", $newNumber, $id);

模式解释/[^\d]+(\d+)$/:

  • [^\d]+ 匹配一个或多个非十进制字符
  • (\d+)$ 然后匹配一个或多个必须在字符串末尾的十进制字符 ($)
  • $matches[1]中存储第一个括号内的匹配字符串

使用自动增量,可以在另一列中指定前缀,并使 PK 成为组合列索引。这有一个额外的好处,您不需要代码来维护它或查询和显示数据:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html