文字列が有効な16進数の色表現であるかどうかを確認する方法は?


120

例えば:

AA33FF =有効な16進数の色

Z34FF9 =無効な16進数の色(Zが含まれています)

AA33FF11 =無効な16進数の色(余分な文字がある)


10
コンテキストに応じて、AARRGGBBフォーマットにアルファが含まれている場合、最後の色は有効な色になる可能性があります。
J.ホームズ

回答:


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

詳しく説明するには:

^ ->始め一致
# ->ハッシュに
[0-9A-F] ->0から9までの任意の整数とFにAから任意の文字
{6} ->前のグループは正確に6回が表示され
$ ->、エンドに一致する
i ->ケースを無視します

3文字のHEXコードのサポートが必要な場合は、以下を使用します。

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

ここでの唯一の違いは

 [0-9A-F]{6}

に置き換えられます

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

つまり、正確に6文字ではなく3文字に一致しますが、1または2回一致します。ABCおよびを許可するが、許可しAABBCCないABCD


18
定義によりこれは正しいですが、長さ3のコードはブラウザの解釈にも有効です。color: #f00;赤(#ff0000)としても解釈されます。
スマティ

13
または別の形式:/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test("#f00")
J.ホームズ

8
私も/^#([0-9a-f]{3}){1,2}$/iミックスに追加します。
MasterAM 2016年

1
@AndresSepar /^#[0-9A-F]{3,6}$/i.test('#aabb')も通過しますが#aabb、有効な16進数の色ではありません。
Roman Boiko

3
var isOk = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/i.test('#aabbcc '); @RomanBoikoこれは正しいです!ありがとう!
Andres Separ 2016

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

この答えはNumber('0x' + hex)、誤検出をスローするために使用されていましたparseInt(hex, 16)
parseInt()文字列の先頭から、基数(16)に含まれていない文字に到達するまで解析します。これは、「AA」で始まるため、「AAXXCC」のような文字列を解析できることを意味します。

Number()一方、文字列全体が基数と一致する場合のみ解析します。さて、Number()基数パラメータを取りませんが、幸いにも、あなたが他の半径の数を取得するために数リテラルの前に付けることができます。

明確にするための表を次に示します。

╭─────────────┬────────────┬────────┬───────────────────╮
 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')    
╰─────────────┴────────────┴────────┴───────────────────╯

6
+1 bcsは、正規表現よりも読みやすく、理解が速くなります
Chris

10
@Chrisの「理由」は、「bcs」よりも読みやすく、理解も速い;-)
Chris

1
@クリス:私は「BC」に慣れているので、違いはありません。とにかく私のコメントは賛辞として意図されたので、幸せになってください。
Chris

12
これは誤りです。parseInt( 'abcZab'、16)は数値を出力してテストに合格します
サルバドールダリ

1
@fflorent parseIntはtakeを実行するため"abcZab"、それ"Z"が(基数16の場合)無効であることを確認し、それ以降は無視します。次に、最初から"abc"それを変換します2748(これはparseInt("abcZab", 16)、ロジックの発生を証明するの結果でもあります)。名前が示すように、文字列をparseInt 解析します。基数が10である数値をユニットで解析する場合のようにparseInt("10px", 10)、を取得し10ます。:あなたは、それはここで説明見ることができますes5.github.io/#x15.1.2.2(ステップ11)
イアン・

8

これは複雑な問題になる可能性があります。何度か試した後、私はかなりクリーンな解決策を思いつきました。ブラウザーに作業を任せましょう。

ステップ1:ボーダースタイルをnoneに設定してdivを作成します。divは画面外に配置することも、ボーダーを使用しないページ上のdivにすることもできます。

手順2:境界線の色を空の文字列に設定します。コードは次のようになります。

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

ステップ3:境界線の色を不明な色に設定します。

e.style.borderColor=testcol;

手順4:色が実際に変更されたかどうかを確認します。testcolが無効な場合、変更は行われません。

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

ステップ5:色を空の文字列に戻して自分の後をクリーンアップします。

e.style.borderColor="";

Div:

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

JavaScript関数:

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;
}

この場合、関数は質問に対してtrue / falseの回答を返します。他のオプションは、有効な色の値を返すことです。元の色の値、borderColorの値、または無効な色の代わりの空の文字列。


IMO、これは少なくともクリーンなソリューションではありません
Gust van de Wal

5

HTMLで使用する場合は、次のパターンを直接使用してみてください。

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

お気に入り

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

リクエストされたフォーマットに一致するかどうかの検証を行います。


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

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

注:これにはjQueryが必要です

これは、16進値だけでなく、すべてのカラータイプで機能します。また、DOMツリーに不要な要素を追加しませ


素晴らしく、簡単で、非常にうまく機能します。個人的に私はif(hexString.indexOf( '#')== -1){return false;を追加しました。}ハッシュをチェックして、色が16進値であったことを初歩的なチェックとして確認する
365SplendidSuns

1

色が有効かどうかを通知する関数が必要な場合は、便利な機能(その色の計算値)を提供し、有効な色でない場合はnullを返すようにすることもできます。これは、「グリーン」、「#FFF」、「#89abcd」、「rgb」のいずれかの形式で「カラー」のRGBA値を取得するための互換性のある(Chrome54&MSIE11)関数での私のスタブです(0,0,128) 'または' 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;
}

0

誤検知がないことを確認するための長さチェックを追加します

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;

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.