我正在使用 Laravel 并尝试验证颜色字段。
此文本框应仅允许 HEX
、rgb
、rgba
、hsl
和 hsla
使用正则表达式模式的颜色。
在我的 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/