Wie überprüfe ich, ob eine Zeichenfolge eine gültige hexadezimale Farbdarstellung ist?

120

Beispielsweise:

AA33FF = gültige Hex-Farbe

Z34FF9 = ungültige Hex-Farbe (enthält Z)

AA33FF11 = ungültige Hex-Farbe (hat zusätzliche Zeichen)

Alex
quelle
10
Je nach Kontext kann die letzte Farbe eine gültige Farbe sein, wenn sie Alpha im AARRGGBBFormat enthält.
J. Holmes

Antworten:

279
/^#[0-9A-F]{6}$/i.test('#AABBCC')

Um dies zu erläutern:

^ ->entsprechen beginnend
# ->ein Hash
[0-9A-F] ->beliebige ganze Zahl von 0 bis 9 und einen beliebigen Buchstaben von A bis F
{6} ->die vorherige Gruppe erscheint genau 6mal
$ ->Ende übereinstimmen
i ->ignorieren Fall

Wenn Sie Unterstützung für dreistellige HEX-Codes benötigen, verwenden Sie Folgendes:

/^#([0-9A-F]{3}){1,2}$/i.test('#ABC')

Der einzige Unterschied ist der

 [0-9A-F]{6}

wird ersetzt durch

([0-9A-F]{3}){1,2}

Dies bedeutet, dass anstelle von genau 6 Zeichen genau 3 Zeichen, jedoch 1 oder 2 Mal übereinstimmen. Erlauben ABCund AABBCC, aber nichtABCD

Royi Namir
quelle
18
Per Definition ist dies korrekt, aber Codes mit einer Länge von 3 gelten auch für die Browserinterpretation. color: #f00;wird ebenfalls als rot (# ff0000) interpretiert.
Smamatti
13
oder eine andere Form:/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test("#f00")
J. Holmes
8
Ich würde auch /^#([0-9a-f]{3}){1,2}$/izu der Mischung hinzufügen .
MasterAM
1
@AndresSepar wird /^#[0-9A-F]{3,6}$/i.test('#aabb')ebenfalls übergeben, #aabbist jedoch keine gültige Hex-Farbe.
Roman Boiko
3
var isOk = /^#([A-Fa-f0-9 weibl .6. @ RomanBoiko das ist richtig! Vielen Dank!
Andres Separ
32

// regular function
function isHexColor (hex) {
  return typeof hex === 'string'
      && hex.length === 6
      && !isNaN(Number('0x' + hex))
}

// or as arrow function (ES6+)
isHexColor = hex => typeof hex === 'string' && hex.length === 6 && !isNaN(Number('0x' + hex))

console.log(isHexColor('AABBCC'))   // true
console.log(isHexColor('AABBCC11')) // false
console.log(isHexColor('XXBBCC'))   // false
console.log(isHexColor('AAXXCC'))   // false

Diese Antwort wurde verwendet, um falsch positive Ergebnisse zu erzielen, da sie stattdessen Number('0x' + hex)verwendet wurde parseInt(hex, 16).
parseInt()analysiert vom Anfang der Zeichenfolge bis ein Zeichen erreicht ist, das nicht in radix ( 16) enthalten ist. Dies bedeutet, dass Zeichenfolgen wie 'AAXXCC' analysiert werden können, da es mit 'AA' beginnt.

Number()Auf der anderen Seite wird nur analysiert, wenn die gesamte Zeichenfolge mit dem Radix übereinstimmt. Number()Nehmen Sie jetzt keinen Radix-Parameter, aber zum Glück können Sie Zahlenliterale voranstellen, um eine Zahl in anderen Radien zu erhalten.

Hier ist eine Tabelle zur Verdeutlichung:

╭─────────────┬────────────┬────────┬───────────────────╮
 Radix        Characters  Prefix  Will output 27    
╞═════════════╪════════════╪════════╪═══════════════════╡
 Binary       0-1         0b      Number('0b11011') 
 Octal        0-7         0o      Number('0o33')    
 Decimal      0-9         -       -                 
 Hexadecimal  0-9A-F      0x      Number('0x1b')    
╰─────────────┴────────────┴────────┴───────────────────╯
fflorent
quelle
6
+1 bcs viel besser zu lesen und schneller zu verstehen als ein Regex
Chris
10
@Chris 'weil' ist auch viel besser zu lesen und schneller zu verstehen als 'bcs' ;-)
Chris
1
@ Chris: Ich habe mich so an 'bcs' gewöhnt, dass es für mich keinen Unterschied macht. Wie auch immer, mein Kommentar war als Kompliment gedacht, also sei glücklich.
Chris
12
Dies ist falsch: parseInt ('abcZab', 16) gibt die Nummer aus und besteht den Test
Salvador Dali
1
@fflorent Weil parseIntnehmen wird "abcZab", finde das "Z"ungültig (für Radix 16) und ignoriere es und alles danach. Es nimmt dann den Anfang "abc"und konvertiert ihn in 2748(was auch das Ergebnis davon ist parseInt("abcZab", 16), zu beweisen, dass dies die Logik ist, die geschieht). Wie der Name schon sagt, wird eine Zeichenfolge parseInt analysiert . Genau wie wenn Sie eine Zahl mit Einheiten mit einem Radix von 10 analysieren parseInt("10px", 10)würden, würden Sie erhalten 10. Sie können es hier beschrieben sehen: es5.github.io/#x15.1.2.2 (Schritt 11)
Ian
8

Dies kann ein kompliziertes Problem sein. Nach mehreren Versuchen fand ich eine ziemlich saubere Lösung. Lassen Sie den Browser die Arbeit für Sie erledigen.

Schritt 1: Erstellen Sie ein Div, dessen Rahmenstil auf "Keine" gesetzt ist. Das Div kann außerhalb des Bildschirms positioniert werden oder es kann ein beliebiges Div auf Ihrer Seite sein, das die Ränder nicht verwendet.

Schritt 2: Setzen Sie die Rahmenfarbe auf eine leere Zeichenfolge. Der Code könnte ungefähr so ​​aussehen:

e=document.getElementbyId('mydiv');
e.style.borderColor="";

Schritt 3: Stellen Sie die Rahmenfarbe auf die Farbe ein, bei der Sie sich nicht sicher sind.

e.style.borderColor=testcol;

Schritt 4: Überprüfen Sie, ob die Farbe tatsächlich geändert wurde. Wenn testcol ungültig ist, wird keine Änderung vorgenommen.

col2=e.style.borderColor;
if(col2.length==0) {alert("Bad Color!");}

Schritt 5: Räumen Sie nach sich selbst auf, indem Sie die Farbe auf eine leere Zeichenfolge zurücksetzen.

e.style.borderColor="";

Die Div:

<div id="mydiv" style="border-style:none; position:absolute; left:-9999px; top:-9999px;"></div>

Nun die JavaScript-Funktion:

function GoodColor(color)
{
   var color2="";
   var result=true;
   var e=document.getElementById('mydiv');
   e.style.borderColor="";
   e.style.borderColor=color;
   color2=e.style.borderColor;
   if (color2.length==0){result=false;}
   e.style.borderColor="";
   return result;
}

In diesem Fall gibt die Funktion eine Richtig / Falsch-Antwort auf die Frage zurück. Die andere Option besteht darin, einen gültigen Farbwert zurückzugeben. Ihr ursprünglicher Farbwert, der Wert von borderColor oder eine leere Zeichenfolge anstelle ungültiger Farben.

Terry Prothero
quelle
IMO, das ist überhaupt keine saubere Lösung
Gust van de Wal
5

Wenn Sie versuchen, es in HTML zu verwenden Versuchen Sie, dieses Muster direkt zu verwenden:

 pattern="^#+([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"

mögen

<input id="hex" type="text" pattern="^#+([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$" />

Es wird eine Validierung gegeben, die dem angeforderten Format entspricht.

Mohit Dhawan
quelle
2
function validColor(color){
  var $div = $("<div>");
  $div.css("border", "1px solid "+color);
  return ($div.css("border-color")!="")
}

https://gist.github.com/dustinpoissant/22ce25c9e536bb2c5a2a363601ba261c

Hinweis: Dies erfordert jQuery

Dies funktioniert für ALLE Farbtypen, nicht nur für Hex-Werte. Es ist auch nicht anhängen unnötige Elemente an den DOM - Baum.

Dustin Poissant
quelle
Schön und einfach und funktioniert sehr gut. Persönlich habe ich hinzugefügt, wenn (hexString.indexOf ('#') == -1) {return false; }, um nach einem Hash zu
suchen, um
1

Wenn Sie eine Funktion benötigen, die Ihnen sagt, ob eine Farbe gültig ist, können Sie sich auch etwas Nützliches geben lassen - die berechneten Werte dieser Farbe - und null zurückgeben, wenn es sich nicht um eine gültige Farbe handelt. Hier ist mein Versuch mit einer kompatiblen (Chrome54 & MSIE11) Funktion, um die RGBA-Werte einer "Farbe" in einem der Formate zu erhalten - sei es "grün" oder "#FFF" oder "# 89abcd" oder "rgb" (0,0,128) 'oder' rgba (0, 128, 255, 0,5) '.

/* getRGBA:
  Get the RGBA values of a color.
  If input is not a color, returns NULL, else returns an array of 4 values:
   red (0-255), green (0-255), blue (0-255), alpha (0-1)
*/
function getRGBA(value) {
  // get/create a 0 pixel element at the end of the document, to use to test properties against the client browser
  var e = document.getElementById('test_style_element');
  if (e == null) {
    e = document.createElement('span');
    e.id = 'test_style_element';
    e.style.width = 0;
    e.style.height = 0;
    e.style.borderWidth = 0;
    document.body.appendChild(e);
  }

  // use the browser to get the computed value of the input
  e.style.borderColor = '';
  e.style.borderColor = value;
  if (e.style.borderColor == '') return null;
  var computedStyle = window.getComputedStyle(e);
  var c
  if (typeof computedStyle.borderBottomColor != 'undefined') {
    // as always, MSIE has to make life difficult
    c = window.getComputedStyle(e).borderBottomColor;
  } else {
    c = window.getComputedStyle(e).borderColor;
  }
  var numbersAndCommas = c.replace(new RegExp('[^0-9.,]+','g'),'');
  var values = numbersAndCommas.split(',');
  for (var i = 0; i < values.length; i++)
    values[i] = Number(values[i]);
  if (values.length == 3) values.push(1);
  return values;
}
Abakus
quelle
0

Fügen Sie eine Längenprüfung hinzu, um sicherzustellen, dass Sie kein falsches Positiv erhalten

function isValidHex(testNum){
  let validHex = false;
  let numLength = testNum.length;
  let parsedNum = parseInt(testNum, 16);
  if(!isNan(parsedNum) && parsedNum.length===numLength){
     validHex = true;
  }
  return validHex;

}}

Rotato Poti
quelle