web-dev-qa-db-ja.com

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

例えば:

AA33FF =有効な16進数の色

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

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

103
Alex
var isOk  = /^#[0-9A-F]{6}$/i.test('#aabbcc')

詳しく説明するには:

^最初に一致
#ハッシュ
[a-f0-9] a-fおよび0-9の任意の文字
{6}前のグループは正確に6回出現します
$マッチ終了
i大文字と小文字を区別しない

より高度な:

 var isOk  = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test('#ac3') // for #f00 (Thanks Smamatti)
240
Royi Namir
function isHexaColor(sNum){
  return (typeof sNum === "string") && sNum.length === 6 
         && ! isNaN( parseInt(sNum, 16) );
}

isHexaColor("AA33FF") => true
isHexaColor("Z34FF9") => false
isHexaColor("AA33FF11") => false

編集:下の@SalvadorDaliのコメントをご覧ください。場合によっては誤検知があります。代わりに別のソリューションを使用してください。

27
fflorent

これは複雑な問題になる可能性があります。いくつかの試みの後、私はかなりきれいなソリューションを思いつきました。ブロウズワーにあなたの仕事を任せましょう。

手順1:border-styleを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;
}

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

9
Terry Prothero
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進数値だけでなく[〜#〜] all [〜#〜]色タイプに対しても機能します。また、not不要な要素をDOMツリーに追加します。

2
Dustin Poissant

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})$" />

要求された形式に一致する検証を行います。

1
Mohit Dhawan

色が有効かどうかを通知する関数が必要な場合は、その色の計算値などの有用なものを提供し、有効な色でない場合はnullを返すようにすることもできます。これは、互換性のある(Chrome54およびMSIE11)関数で、「green」、「#FFF」、「#89abcd」、または「rgb」のいずれかの形式で「色」のRGBA値を取得するためのスタブです。 (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;
}
1
Abacus

長さチェックを追加して、誤検知が発生しないようにします

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;

}

0
rotato poti