rgb/rgba in PHP zu Hex-Werten transformieren
Veröffentlicht: – Kommentar hinterlassen Letzte Aktualisierung:
Während der Anpassung von Farbwerten in PHP suchte ich einem Weg, rgb()
und rgba()
in ihre jeweiligen Hex-Äquivalente zu transformieren, da ich diese mehr mag und einfacher damit weiterarbeiten kann. Und da die Hex-Notation nun schon eine Weile in CSS auch den Alpha-Kanal definieren kann, gibt es keinen Showstopper, um dafür eine Lösung zu bauen. Aber eben weil diese Notation des Alpha-Kanals noch recht neu ist, konnte ich keinen Code-Snippet in der Wildnis finden, der das tut, was ich wollte. Also schrieb ich ihn selbst.
/**
* Convert rgb() or rgba() to #rrggbbaa for hex codes.
*
* @param string $color The RGB(A) color
* @return string The color hex code
*/
function rgb_to_hex( string $color ): string {
$has_alpha = false;
if ( strpos( $color, 'rgba' ) === 0 ) {
$has_alpha = true;
}
$color = preg_replace( '/^rgba?\(/', '', $color );
$color = preg_replace( '/\)$/', '', $color );
if ( strpos( $color, ',' ) !== false ) {
$color = str_replace( ' ', '', $color );
$values = explode( ',', $color );
}
else {
$color = str_replace( '/', ' ', $color );
$color = preg_replace( '/\s{2,}/', ' ', $color );
$values = explode( ' ', $color );
}
if ( $has_alpha && count( $values ) === 4 ) {
$color = sprintf( '%02x%02x%02x%02x', $values[0], $values[1], $values[2], $values[3] * 255 );
}
else if ( ! $has_alpha && count( $values ) === 3 ) {
$color = sprintf( '%02x%02x%02x', $values[0], $values[1], $values[2] ) . 'ff';
}
else {
$color = '';
}
if ( empty( $color ) ) {
throw new Exception( 'Color could not be transformed into hex.' );
}
return '#' . $color;
}
Code-Sprache: PHP (php)
Zuerst prüfe ich, ob der gegebene Code einen Alpha-Kanal beinhaltet oder nicht, und zwar indem ich prüfe, ob entweder nur rgb
oder rgba
in der Zeichenfolge gegeben sind (Zeile 8 – 12). Dann entferne ich alles außerhalb der Farbwerte (Zeile 14 – 15), sodass aus einem rgba(10, 10, 10, .5)
ein 10, 10, 10, .5
wird. Da es zwei Notationen für rgb
/rgba
gibt, einen mit, einen ohne Kommas, letzterer aber mit einem /
zwischen den rgb
-Werten und dem Alpha-Kanal, generiere ich ein Array je nach dem, welche Version ich erhielt (Zeile 17 – 25).
Zuletzt transformiere ich die Werte in die entsprechende Hex-Notation (Zeile 27 – 32) und dann entweder zurückgegeben oder eine Exception geworfen, wenn die Farbe nicht erfolgreich transformiert wurde (Zeile 37 – 41).
Es könnte hier mehr Fehlerprüfungen für den gegebenen Wert geben, beispielsweise mit einem regulären Ausdruck wie diesem (der auch nicht hundertprozentig sicher ist, da er auch eine Syntax wie rgb(10, 10, 10 / .5)
erlaubt, was keiner gültigen Notation entspricht):rgba?(([0-255]+(,?\s?)){3}(,|\/)?\s?(([0-1]*.)?\d{1})?)
Aber für mich genügt der aktuelle Weg, da ich auch die Funktionen kontrolliere, die diesen Wert an die Transformations-Funktion übergeben.