<?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";
}
- Output for 7.4.0 - 7.4.33, 8.0.1 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
- array (
0 => 'VBUG1234',
1 => true,
2 =>
array (
0 => 'VBUG1234',
1 => 'V',
2 => 'BUG',
3 => '1234',
4 => '',
),
3 => 'VBUG1234',
)
array (
0 => 'QMO54321A',
1 => true,
2 =>
array (
0 => 'QMO54321A',
1 => 'Q',
2 => 'MO',
3 => '54321',
4 => 'A',
),
3 => 'QMO54321A',
)
array (
0 => 'NOMG111',
1 => true,
2 =>
array (
0 => 'NOMG111',
1 => 'N',
2 => 'OMG',
3 => '111',
4 => '',
),
3 => 'NOMG0111',
)
array (
0 => 'WX1111',
1 => true,
2 =>
array (
0 => 'WX1111',
1 => 'W',
2 => 'X',
3 => '1111',
4 => '',
),
3 => 'WX001111',
)
array (
0 => 'NOPE666A',
1 => false,
2 =>
array (
),
3 => '',
)
array (
0 => 'SCON3111Z',
1 => true,
2 =>
array (
0 => 'SCON3111Z',
1 => 'S',
2 => 'CON',
3 => '3111',
4 => 'Z',
),
3 => 'SCON3111Z',
)
preferences:
116.43 ms | 409 KiB | 5 Q