php - 在 php 中使用正则表达式验证十六进制和 rgba 颜色

标签 php regex laravel colors

text field

我正在使用 Laravel 并尝试验证颜色字段。 此文本框应仅允许 HEXrgbrgbahslhsla使用正则表达式模式的颜色。

在我的 Controller 中,我有这个模式,但它没有验证我的字段值。任何字符串都会通过验证。

$this->validate($request, [
    'color' => [
        'required',
        'regex:/(#(?:[0-9a-f]{2}){2,4}|#[0-9a-f]{3}|(?:rgba?|hsla?)\((?:\d+%?(?:deg|rad|grad|turn)?(?:,|\s)+){2,3}[\s\/]*[\d\.]+%?\))/i', // <--- not working
    ],
]);

谢谢。

最佳答案

您应该添加 anchor (^$):

'regex:/^(#(?:[0-9a-f]{2}){2,4}|#[0-9a-f]{3}|(?:rgba?|hsla?)\((?:\d+%?(?:deg|rad|grad|turn)?(?:,|\s)+){2,3}[\s\/]*[\d\.]+%?\))$/i',
        ^                                                                                                                     ^

使正则表达式应用于整个输入而不是仅仅匹配它。

但请注意,您的模式允许像 rgba(1024, 1023, 0) 这样的输入,这是一种无效的颜色。


如果你想要一个更可靠的正则表达式,使用这个(demo):

^(\#[\da-f]{3}|\#[\da-f]{6}|rgba\(((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*,\s*){2}((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*)(,\s*(0\.\d+|1))\)|hsla\(\s*((\d{1,2}|[1-2]\d{2}|3([0-5]\d|60)))\s*,\s*((\d{1,2}|100)\s*%)\s*,\s*((\d{1,2}|100)\s*%)(,\s*(0\.\d+|1))\)|rgb\(((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*,\s*){2}((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*)|hsl\(\s*((\d{1,2}|[1-2]\d{2}|3([0-5]\d|60)))\s*,\s*((\d{1,2}|100)\s*%)\s*,\s*((\d{1,2}|100)\s*%)\))$

关于php - 在 php 中使用正则表达式验证十六进制和 rgba 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43706082/

相关文章:

php - 喜欢使用 Laravel 构建表格,并在顶部显示最受欢迎的内容

regex - 在RegExp匹配Golang中排除模式

sql - 查找字符串只包含字符

php - 如何为内联元素创建带有 HTML 内容的纯 CSS 工具提示

php - php 中的 floor() 不工作

php - 为新闻管理创建类别和子类别系统

mysql - 语法错误或访问冲突 : 1055 'database.order.oid' isn't in GROUP BY

用于 Laravel 验证的仅接受单词或字母的正则表达式组合

php - 如何使用php和mysql动态计算经纬度距离?

Python:捕获并返回量词中的每个元素