我如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 或 hsl 颜色?

2023-12-19

我使用正则表达式来表示十六进制。/^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/但我不知道我应该做什么来找到 rgb、rgba 和 hsl。我正在以字符串形式获取输入。例如,输入将包含“rgb(0,0,0)”或“rgb(0,0,0,0.2)”。


这里有不同的选择:

1. 使用虚拟元素

使用浏览器的验证。创建一个dummyHTML 元素,分配颜色并检查是否已设置。这是迄今为止最好的选择。它不仅更容易,而且还允许向前兼容。

function CheckValidColor(color) {
    var e = document.getElementById('divValidColor');
    if (!e) {
        e = document.createElement('div');
        e.id = 'divValidColor';
    }
    e.style.borderColor = '';
    e.style.borderColor = color;
    var tmpcolor = e.style.borderColor;
    if (tmpcolor.length == 0) {
        return false;
    }
    return true;
}

// function call
var inputOK = CheckValidColor('rgb( 0, 0, 255)');

这将返回true适用于浏览器接受的所有颜色,即使在您可能认为无效的情况下也是如此。


2. 使用正则表达式捕获数字并在代码中验证

如果你捕捉到任何东西看起来像一个数字,您将能够单独验证每个参数IF clauses。这将使您能够向用户提供更好的反馈。

a) #hex:

^(#)((?:[A-Fa-f0-9]{3}){1,2})$

还捕获哈希值以与以下表达式保持一致。DEMO https://regex101.com/r/yF0uY1/1

b) rgb()、rgba()、hsl() 和 hsla():

^(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$

这将为函数和每个参数创建捕获。DEMO https://regex101.com/r/yF0uY1/2


3. 使用一个怪物正则表达式进行验证:

不推荐使用此选项,主要是因为它很难阅读,它不能保证匹配所有用例,并且如果您尝试调试它,它会让您头疼。以下正则表达式验证允许的参数数量和范围。

a) #hex: ^#(?:[A-Fa-f0-9]{3}){1,2}$ DEMO https://regex101.com/r/yF0uY1/3

b)RGB(): ^rgb[(](?:\s*0*(?:\d\d?(?:\.\d+)?(?:\s*%)?|\.\d+\s*%|100(?:\.0*)?\s*%|(?:1\d\d|2[0-4]\d|25[0-5])(?:\.\d+)?)\s*(?:,(?![)])|(?=[)]))){3}[)]$ DEMO https://regex101.com/r/yF0uY1/4

c) rgba(): ^^rgba[(](?:\s*0*(?:\d\d?(?:\.\d+)?(?:\s*%)?|\.\d+\s*%|100(?:\.0*)?\s*%|(?:1\d\d|2[0-4]\d|25[0-5])(?:\.\d+)?)\s*,){3}\s*0*(?:\.\d+|1(?:\.0*)?)\s*[)]$ DEMO https://regex101.com/r/yF0uY1/5

d) hsl(): ^hsl[(]\s*0*(?:[12]?\d{1,2}|3(?:[0-5]\d|60))\s*(?:\s*,\s*0*(?:\d\d?(?:\.\d+)?\s*%|\.\d+\s*%|100(?:\.0*)?\s*%)){2}\s*[)]$ DEMO https://regex101.com/r/yF0uY1/6

e) hsla(): ^hsla[(]\s*0*(?:[12]?\d{1,2}|3(?:[0-5]\d|60))\s*(?:\s*,\s*0*(?:\d\d?(?:\.\d+)?\s*%|\.\d+\s*%|100(?:\.0*)?\s*%)){2}\s*,\s*0*(?:\.\d+|1(?:\.0*)?)\s*[)]$ DEMO https://regex101.com/r/yF0uY1/7

现在都在一起了:

通过上面的表达式,我们可以创建这个单行代码来验证所有合法的颜色值:

^(?:#(?:[A-Fa-f0-9]{3}){1,2}|(?:rgb[(](?:\s*0*(?:\d\d?(?:\.\d+)?(?:\s*%)?|\.\d+\s*%|100(?:\.0*)?\s*%|(?:1\d\d|2[0-4]\d|25[0-5])(?:\.\d+)?)\s*(?:,(?![)])|(?=[)]))){3}|hsl[(]\s*0*(?:[12]?\d{1,2}|3(?:[0-5]\d|60))\s*(?:\s*,\s*0*(?:\d\d?(?:\.\d+)?\s*%|\.\d+\s*%|100(?:\.0*)?\s*%)){2}\s*|(?:rgba[(](?:\s*0*(?:\d\d?(?:\.\d+)?(?:\s*%)?|\.\d+\s*%|100(?:\.0*)?\s*%|(?:1\d\d|2[0-4]\d|25[0-5])(?:\.\d+)?)\s*,){3}|hsla[(]\s*0*(?:[12]?\d{1,2}|3(?:[0-5]\d|60))\s*(?:\s*,\s*0*(?:\d\d?(?:\.\d+)?\s*%|\.\d+\s*%|100(?:\.0*)?\s*%)){2}\s*,)\s*0*(?:\.\d+|1(?:\.0*)?)\s*)[)])$

DEMO https://regex101.com/r/yF0uY1/8

或者正则表达式爱好者可以检查一下巨大的正则表达式 https://regex101.com/r/yF0uY1/9,有 148 个颜色名称。但我绝不会建议使用这种模式。请使用第一个选项,创建一个虚拟元素,这是覆盖浏览器所有用例的唯一方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 或 hsl 颜色? 的相关文章

随机推荐

  • 返回具有最大子文档的文档

    我试图根据日期值返回一个包含最大子文档的文档 到目前为止 我能够创建正确的对象 但是查询返回所有子文档而不是具有最大日期的子文档 例如 我的数据存储为 value 1 id 5cb9ea0c75c61525e0176f96 name Tes
  • 如何在django中故意返回404页面

    我在 django 中制作了自定义 404 页面 我正在尝试故意获取 404 错误页面 myproject urls py from website views import customhandler404 customhandler50
  • HttpClient 4 - 如何捕获最后的重定向 URL

    我有相当简单的 HttpClient 4 代码 它调用 HttpGet 来获取 HTML 输出 HTML 返回 脚本和图像位置均设置为本地 例如 img src images foo jpg 所以我需要调用 URL 将它们变成绝对 img
  • 如何更改清理作业的 cdc 保留值?

    我正在 asp net mvc2 应用程序上实现日志记录功能 该应用程序使用 SqlServer2008 作为数据库 使用实体框架作为数据模型 我启用了 Sql Server 的 CDC 功能 其日志记录更改得很好 但我刚刚注意到一些旧的日
  • 在 OSX Mavericks 上的 R 中安装 rjags

    我正在尝试在 R 中安装包 rjags 但遇到以下错误 Loading required package rjags Error onLoad failed in loadNamespace for rjags details call d
  • Square 随机数代表什么?

    我正在尝试向 Square 提交付款 但不确定该付款是什么card nonce代表 完整的 API 文档在这里 https docs connect squareup com api connect v2 endpoint createcu
  • 反转 DataFrame 列顺序

    我想简单地反转给定 DataFrame 的列顺序 我的数据框 data year 2010 2011 2012 2011 2012 2010 2011 2012 team Bears Bears Bears Packers Packers
  • 使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON

    我正在尝试调用非常简单的 json Web 服务 返回这种形式的数据 embedded users identifier 1 firstName John lastName Doe links self href http localhos
  • Mongodb类型参考节点

    我正在尝试引用节点模型中的另一个对象 User new Schema username type String index unique true Idea new Schema Creator type User 但我收到这个错误Unde
  • 无法从按钮 onclick 事件 ASP.NET 4 调用 Javascript 函数

    每当我调用 JavaScript 函数时asp button onclick事件我收到此错误消息 HTML
  • Android:如何将一个菜单 xml 包含在另一个菜单 xml 中?

    简单的问题 我有我的子项目菜单 menu menu
  • 权限问题:如何在 docker for windows 上设置权限以与 Wordpress 一起使用

    问题 I m trying to setup my developing environment using Docker for Windows for use with Wordpress I m using docker compos
  • 如何在所有测试文件之前运行 Jasmine

    我正在使用 Nodejs 为我们的 API 创建端到端测试套件 在每个测试运行之前 我需要插入该测试的数据库记录 许多有问题的表不使用本机自动增量类型字段作为其主键 我知道 数据库设计不好 但我无法控制 相反 他们使用 postgresql
  • 在二叉树中查找共同祖先

    在一次采访中有人问我这个问题 我有一个二叉树 我必须在给定该树的两个随机节点的情况下找到共同祖先 父级 我还得到了一个指向根节点的指针 我的回答是 分别遍历树的两个节点 直到到达预期的节点 并行遍历时将元素和下一个地址存储在链表中 那么我们
  • 删除字符串末尾的下划线和数字

    我正在使用一个包含带有一些下划线的列的数据集 有一个图案 但它们是不同的图案 如下所示 ID Col1 1029 ap analog 2334 critical 1 mm 1 2334 transpose 2 mm 2 9877 publi
  • php中逗号分隔的列表

    我正在尝试建立一个用逗号分隔的列表 应该如下所示 绿色 橙色 红色 i 0 taxonomy form state values taxonomy 5 foreach taxonomy as key gt value result db q
  • Java中如何打印Statement(CallableStatement)?

    如何打印此 OracleCallableStatement ocstmt OracleCallableStatement connection prepareCall call package method id gt name gt oc
  • 如何抑制CatBoost迭代结果?

    我正在尝试使用 CatBoost 来拟合二进制模型 当我使用下面的代码时 我想verbose False可以帮助抑制迭代日志 但事实并非如此 有没有办法避免打印迭代 model CatBoostClassifier iterations 3
  • 动态更改数据模板

    我有一个绑定到任务的项目控件 每个任务都有任务状态 我为每个任务状态定义了不同的数据模板 以及数据模板选择器 问题是我无法弄清楚当任务状态动态更改时如何触发数据模板选择器 我想知道如何将数据触发器与数据模板一起使用 如果这不起作用 我将探索
  • 我如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 或 hsl 颜色?

    我使用正则表达式来表示十六进制 a fA F0 9 6 a fA F0 9 3 但我不知道我应该做什么来找到 rgb rgba 和 hsl 我正在以字符串形式获取输入 例如 输入将包含 rgb 0 0 0 或 rgb 0 0 0 0 2 这