$re = '/(?:(AT)\s*(U[0-9]{8}))|(?:(BE)\s*(0?[0-9]{*}))|(?:(CZ)\s*([0-9]{8,10}))|(?:(DE)\s*([0-9]{9}))|(?:(CY)\s*([0-9]{8}[A-Z]))|(?:(DK)\s*([0-9]{8}))|(?:(EE)\s*([0-9]{9}))|(?:(GR)\s*([0-9]{9}))|(?:(ES)\s*([0-9A-Z][0-9]{7}[0-9A-Z]))|(?:(FI)\s*([0-9]{8}))|(?:(FR)\s*([0-9A-Z]{2}[0-9]{9}))|(?:(GB)\s*(([0-9]{9}|[0-9]{12})~(GD|HA)[0-9]{3}))|(?:(HU)\s*([0-9]{8}))|(?:(IE)\s*([0-9][A-Z0-9\\\\+\\\\*][0-9]{5}[A-Z]))|(?:(IT)\s*([0-9]{11}))|(?:(LT)\s*(([0-9]{9}|[0-9]{12})))|(?:(LU)\s*([0-9]{8}))|(?:(LV)\s*([0-9]{11}))|(?:(MT)\s*([0-9]{8}))|(?:(NL)\s*([0-9]{9}B[0-9]{2}))|(?:(PL)\s*([0-9]{10}))|(?:(PT)\s*([0-9]{9}))|(?:(SE)\s*([0-9]{12}))|(?:(SI)\s*([0-9]{8}))|(?:(SK)\s*([0-9]{10}))|(?:\D|^)([0-9]{11})(?:\D|$)|(?:(CHE)(-|\s*)([0-9]{3}\.[0-9]{3}\.[0-9]{3}))/i';
$str = 'CHE-459.288.946
IDI n. CHE-459.288.946
CHE 459.288.946
PI:01924110289 CF BGGLNI40S20I008I
LV12345678901
12345678901';
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