<?php
// https://www.ppaonline.com.au/wp-content/uploads/2019/05/DVA-number-format-factsheet.pdf
// https://meteor.aihw.gov.au/content/339127
$DVAs = [
'VBUG1234', // veteran
'QMO54321A', // dependent
'NOMG111', // veteran
'WX1111', // veteran
'NOPE666A', // invalid
'SCON3111Z', // dependent
];
// file number is 1-3 letters or a space for WW1 (war code) followed by upto 6 digits
// file number has a max length of 7
$regex = <<<REGEX
/
^
([NVQWST])
(?|
([ ANPVX])(\d{1,6})
|(
BG
|CN
|ET
|F[RW]
|G[RW]
|I[QTV]
|JA
|K[MO]
|MO
|N[FGKX]
|P[KOX]
|R[DMU]
|S[AELMORS]
|U[BS]
|YU
)(\d{1,5})
|(
(?:A(?:FG|GX|LX|R[GX])
|B(?:A[GL]|CG|G[GKX]|RX|U[GRX])
|C(?:AM|CG|HX|IX|LK|N[KSX]|ON|YP|Z[GX])
|D(?:EG|N[KX])
|E(?:G[GXY]|SX|T[KX])
|F(?:I[JX]|R[GKX])
|G(?:HA|R[EGKX])
|H(?:K[SX]|L[GKX]|UX)
|I(?:DA|ND|SR|T[GKX])
|K(?:OS|SH|UG|YA)
|L(?:AX|BX|XK)
|M(?:A[LRU]|LS|OG|TX|WI)
|N(?:BA|CG|GR|IG|RD|S[MSW]|W[GKX])
|OMG
|P(?:A[DGLMX]|C[AGRV]|H[KSX]|L[GX]|MS|S[MW]|WO)
|QAG
|R(?:DX|U[GX])
|S(?:A[GX]|CG|EG|IN|PG|UD|W[KP]|Y[GRX])
|T(?:H[KS]|R[GK]|ZA)
|U(?:AG|RX|S[GKSX])
|V(?:EX|NS)
|Y(?:EM|GX)
|ZIM
)
)(\d{1,4})
)
([A-Z]?)
$
/x
REGEX;
foreach ($DVAs as $DVA) {
var_export([
$DVA,
(bool) preg_match($regex, $DVA, $m),
$m,
$m ? sprintf(
'%s%s%0' . (7 - strlen($m[2])) . 's%s',
$m[1],
$m[2],
$m[3],
$m[4]
)
: ''
]);
echo "\n";
}
preferences:
41.09 ms | 406 KiB | 5 Q