【问题标题】:What is you favourite approach to check if a HTML COLOR is valid?你最喜欢用什么方法来检查 HTML COLOR 是否有效?
【发布时间】:2011-07-30 15:26:39
【问题描述】:

我使用 C# 和 ASP.NET 4 WebControls。

我的页面上有一个文本框,用户可以输入十六进制格式(ff0000)或 HTML 格式(“红色”)的 HTML 颜色。

我最初的想法是编写一个能够验证此用户输入的正则表达式太难了,所以我想出了一个想法,编写一个简单的方法来检查输入的颜色是否可以转换为要使用的有效颜色System.Drawing 的上下文。

在我的代码下方。它返回一个 Bool DataType 说明操作是否成功。 它现在工作正常,但我想知道:

  • 如果我的方法写得好?
  • 您知道更好的方法吗?

感谢您的考虑。

using SD = System.Drawing;

protected static bool CheckValidFormatHtmlColor(string inputColor)
        {
            try
            {
                SD.Color myColor = SD.ColorTranslator.FromHtml(inputColor);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

【问题讨论】:

  • 你的代码是我觉得最实用的

标签: c# asp.net html


【解决方案1】:

异常处理很繁重,应该作为最后的手段使用,并且只用于实际的异常。尝试这个。它检查有效的 html 十六进制颜色,然后尝试命名颜色。

protected static bool CheckValidFormatHtmlColor(string inputColor)
{
       //regex from http://stackoverflow.com/a/1636354/2343
       if (Regex.Match(inputColor, "^#(?:[0-9a-fA-F]{3}){1,2}$").Success)
           return true;

       var result = System.Drawing.Color.FromName(inputColor);
       return result.IsKnownColor;
}

【讨论】:

    【解决方案2】:

    我的直觉告诉我,当涉及到正确的 HTML 颜色代码之类的东西时,我不信任微软。我发现您正在使用的似乎是 the source code to the class,它接受很多不是 HTML 颜色的东西。

    然后检查列表的正则表达式听起来是明智的做法。

    修剪空白后,检查它是否匹配/^#[a-fA-F0-9]{6}$/,如果不匹配,则将其与出现在HTML 中的list of 16 colours 进行比较。

    【讨论】:

    • 感谢 David 提供您的 regx --- 但是您对方法有何看法?
    • 我在顶部添加了一个段落,对您正在使用的课程进行了一些调查。
    • 谢谢大卫,我会试试广告,让你知道。现在谢谢。
    • 我的直觉是这个方法接受一个 CSS 颜色值。只是在写它的 2000 年左右,在许多人的心目中,这种区别可能还没有那么明显。
    【解决方案3】:

    一个适合所有人的正则表达式,只是为了好玩。最后的 i 用于不区分大小写。可能不快,但“一枪”。

    HTML 颜色

    /^(#[a-f0-9]{6}|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i
    

    CSS 颜色

    /^(#[a-f0-9]{6}|#[a-f0-9]{3}|(rgb|hsl) *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|(rgba|hsla) *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i
    

    【讨论】:

    • 你错过了 hsl 和 hsla 配色方案
    • @SuryaPratap 对!我想只是复制 rgb 和 rgba 部分可能会奏效。或者还添加内部 (rgb|hsl) 和 (rgba|hsla) 开关..
    • alpha 也有 4 和 8 长度的十六进制。应该是“#[a-f0-9]{8}|#[a-f0-9]{6}|#[a-f0-9]{3,4}”?
    【解决方案4】:
    using System.Text.RegularExpressions;
    
    var regexColorCode = new Regex("^#[a-fA-F0-9]{6}$");
    string colorCode = "#FFFF00";
    
    if (!regexColorCode.IsMatch(colorCode.Trim()))
    {   
        ScriptManager.RegisterStartupScript(this, GetType(), "showalert" ,"alert('Enter a valid Color Code');", true);
    }
    else
    {
        //do your thing
    }
    

    【讨论】:

      【解决方案5】:

      Main 方法

      static void Main(string[] args)
      {
          List<string> testColors = new List<string>
          {
              null
              ,""
              ,"#00"
              ,"#000"
              ,"#12345aa"
              ,"#fff1az"
              ,"#FFDFD991"
              ,"ajdoajsdoijsaod"
          };
      
          foreach (var color in testColors)
          {
              bool result = IsHtmlColor(color);
              Console.WriteLine($"IsHtmlColor({color}) => {result}");
          }
      
      }
      

      辅助方法

      public static bool IsHtmlColor(string hexa)
      {
          try
          {
              // using System.Windows.Media;
              return ColorConverter.ConvertFromString(hexa) is Color;
          }
          catch
          {
              return false;
          }
      }
      

      【讨论】:

      • 欢迎来到 StackOverflow。请提供一些解释,为什么您认为您提出的解决方案可能对 OP 有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2017-09-06
      相关资源
      最近更新 更多