$re = '/^(?:([[:xdigit:]]{2})([^[:xdigit:]]?)(?1)(\2(?1))(?3){3}|((?1){2})((?2))(?4)\5(?4))$/m';
$str = '# Common formats :
fc:92:3b:ed:cb:a9
fc-92-3b-ed-cb-a9
fc92.3bed.cba9
# Matching is case insensitive :
fC:92:3b:Ed:cB:a9
fC92.3bEd.cBa9
# Separator can be empty or any character execept hexadecimal ones :
fc 92 3b ed cb a9
fc92g3bedgcba9
fc923bedcba9
# Separators must be identicals, will not match otherwise :
fc:92:3b-ed:cb:a9
fc92.3bed;cba9';
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