Qualche volta può capitare che abbiamo bisogno di convertire un colore esadecimale con #fff (bianco) nella sua versione RGB, in questo caso 255,255,255, normalmente dovremo aprire il nostro editor di grafica preferito oppure andare in pagine web specializzate ma grazie a php possiamo ovviare a questo problema scrivendo 2 funzioni che faranno tutto il lavoro al posto nostro.
Per prima cosa dovremo creare la funzione esa_conv() con la quale convertiremo ogni carattere/cifra nella sua versione decimale:
function esa_conv($val) {
if (is_numeric($val)) {
return $val;
} else {
switch($val) {
case "a":
return 10;
case "b":
return 11;
case "c":
return 12;
case "d":
return 13;
case "e":
return 14;
case "f":
return 15;
default:
return false;
}
}
}
Andiamo ad analizzare il codice:
Per prima cosa tramite un if controlliamo se il valore su cui stiamo agendo è un numero grazie alla funzione is_numeric e facciamo ritornare quel numero.
Nel caso in cui non è un numero usiamo uno switch e facciamo ritornare il valore decimale corrispondente, nel caso di lettera non ammessa si farà ritornare false.
Ora creeremo la funzione esa_col() che restituirà un array con le 3 cifre che corrispondono al nostro colore rgb se non ci sono stati errori, altrimenti restituisce folse.
function esa_col($color) {
$check = substr($color,0,1);
if($check != "#") { return false; }
$length = strlen($color)-1;
$color = substr($color,1,$length);
$add_color = null;
$particolar = null;
switch($length) {
case 1: $add_color = "00000"; break;
case 2: $add_color = "0000"; break;
case 4: $add_color = "00"; break;
case 5: $add_color = "0" ;break;
case 6: break;
case 3: $particolar = "3"; break;
default: return false;
}
if ($particolar == "3") {
$color = substr($color,0,1).substr($color,0,1).substr($color,1,1).substr($color,1,1).substr($color,1,1).substr($color,1,1);
} else {
$color = $add_color.$color;
}
$first = substr($color,0,1);
$second = substr($color,1,1);
$third = substr($color,2,1);
$forth = substr($color,3,1);
$fifth = substr($color,4,1);
$sixth = substr($color,5,1);
$first = esa_conv($first)*16+esa_conv($second);
$second = esa_conv($third)*16+esa_conv($forth);
$third = esa_conv($fifth)*16+esa_conv($sixth);
return array($first,$second,$third);
}
Analizziamo il codice passo per passo:
$check = substr($color,0,1);
if($check != "#") { return false; }
Viene creata una variabile di nome check contenente il primo carattere della stringa che successivamente verrà utilizzata per controllare se questo è diverso da “#” e se non lo è facciamo ritornare false.
$length = strlen($color)-1; $color = substr($color,1,$length);
Viene tolta alla variabile $color il simbolo “#”.
switch($length) {
case 1: $add_color = "00000"; break;
case 2: $add_color = "0000"; break;
case 4: $add_color = "00"; break;
case 5: $add_color = "0" ;break;
case 6: break;
case 3: $particolar = "3"; break;
default: return false;
}
if ($particolar == "3") {
$color = substr($color,0,1).substr($color,0,1).substr($color,1,1).substr($color,1,1).substr($color,1,1).substr($color,1,1);
} else {
$color = $add_color.$color;
}
Se la lunghezza della stringa contenuta in $color è minore di 6 gli vengono aggiunti un numeri di “0” per far si che raggiunga i 6 caratteri, se contiene inizialmente più caratteri di quanti richiesti farà ritornare false, nel caso in cui i caratteri siano 3 viene preso carattere per carattere inserendolo 2 volte.
$first = substr($color,0,1); $second = substr($color,1,1); $third = substr($color,2,1); $forth = substr($color,3,1); $fifth = substr($color,4,1); $sixth = substr($color,5,1);
Vengono prelevati i 6 caratteri che compongono la stringa.
$first = esa_conv($first)*16+esa_conv($second); $second = esa_conv($third)*16+esa_conv($forth); $third = esa_conv($fifth)*16+esa_conv($sixth); return array($first,$second,$third);
Questo è il cuore della funzione, vengono presi 2 valori adiacenti alla volte ($first con $second, $third con $forth, $fifth con $sixth) e ne viene creato il corrispondente valore decimale.
Alla fine facciamo ritornare un array contenente i 3 numeri.
Ricordo che la funzione farà ritornare false nel caso in cui:
- il prima carattere sia diverso da “#”
- una delle cifre non sia ammessa
- il numero di caratteri della stringa sia maggiore di 6
Spero che l’articolo vi sia utile. Ti è piaciuto l’articolo? supportaci condividendo e commentando! A domani!







Mitico,mi hai salvato!Proprio oggi stavo scrivendo una funzione simile per un progetto, mi ha fatto risparmiare un bel po’ di lavoro!Grazie mille!