Per il momento l'ho rigirata così e sembra funzionare ma magari il 3 e il 6 si possono definire in altro modo.

Attendo pareri.

Codice PHP:
echo preg_match("#^[a-f0-9]{3}$|^[a-f0-9]{6}$#i",$colore) ? 'valida' 'non valida'