你最喜欢的验证HTML颜色是否有效的方法是什么?

7

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

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

我的初步想法是写一个正则表达式来验证用户的输入,但我想到了一个简单的方法,检查输入的颜色是否可以转换为可用于System.Drawing上下文的有效颜色。

以下是我的代码。它返回一个布尔数据类型,指示操作是否成功。目前它工作得很好,但我想知道:

  • 我的方法写得好吗?
  • 你知道更好的方法吗?

感谢您的考虑。

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

1
你的代码是我认为最实用的。 - Tobias
5个回答

16

异常处理是较为繁重的操作,应该被当作最后手段并且仅用于真正的异常情况。尝试这个方法,它检查有效的 HTML 十六进制颜色码,然后尝试使用命名颜色。

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

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

8
我的直觉告诉我,在获取 HTML 颜色代码方面,不应相信微软。我找到了一个类的源代码你正在使用它,该类接受许多不是 HTML 颜色的东西。
因此,使用正则表达式检查列表是否是最明智的方法。在修剪空格后,检查它是否与/^#[a-fA-F0-9]{6}$/匹配。如果不匹配,则将其与出现在 HTML 中的16种颜色的列表进行比较。

谢谢David提供的正则表达式,但你对于方法有什么看法? - GibboK
我已经在顶部添加了一段文字,对你正在使用的类进行了一些调查。 - Quentin
谢谢David,我会尝试并告诉你结果的。暂时先谢谢你。 - GibboK
我的直觉告诉我,这个方法实际上接受的是CSS颜色值。只是在它编写于2000年左右的时候,很多人可能没有如此明确地区分开来。 - Joey

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颜色方案。 - Surya Pratap
@SuryaPratap 对!我猜只需复制RGB和RGBA代码段就可以解决问题。或者也可以添加内部(RGB | HSL)和(RGBA | HSLA)开关。 - FrancescoMM
还有用于字母的4位和8位十六进制码。应该是“#[a-f0-9]{8}|#[a-f0-9]{6}|#[a-f0-9]{3,4}”吗? - XzaR

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

1

主方法(Main method)

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

1
欢迎来到StackOverflow。请提供一些解释,为什么您认为您提出的解决方案可能会帮助提问者。 - Peter Csala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接