$re = '/^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$/mi';
$str = 'AI-1111
ASCN 1ZZ
STHL 1ZZ
TDCU 1ZZ
BBND 1ZZ
BIQQ 1ZZ
FIQQ 1ZZ
GX11 1ZZ
PCRN 1ZZ
SIQQ 1ZZ
TKCA 1ZZ
BFPO 11
ZZ 11
GE CX
KY1-1111
VG1111
MSR 1111
A1A 1AA
A1 1AA
A11 1AA
AA1 1AA
AA1A 1AA
AA11 1AA
A1A1AA
A11AA
A111AA
AA11AA
AA1A1AA
AA111AA
GIR 0AA
GIR0AA
BFPO 1
BFPO 11
BFPO 111
BFPO 1111
SAN TA1';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php