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!