在php中使用正则表达式验证hex和rgba颜色

Abd*_*bab 5 php regex colors laravel

文本域

我正在使用Laravel,我正在尝试验证色域.该文本框应仅允许HEX,rgb,rgba,hslhsla使用正则表达式的颜色.

在我的控制器中,我有这种模式,但它没有验证我的字段值.任何字符串都将通过验证.

$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
    ],
]);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Tho*_*oub 7

你应该添加锚点(^$):

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

要使正则表达式适用于整个输入而不是仅匹配它.

但请注意,您的图案允许输入rgba(1024, 1023, 0)颜色无效.


如果你想要一个更加防弹的正则表达式,使用这个(演示):

^(\#[\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*%)\))$
Run Code Online (Sandbox Code Playgroud)

  • 给予好评.我喜欢防弹正则表达式.看起来很坚固:http://sandbox.onlinephpfunctions.com/code/7ea50ebe40909e13efbcf53d69d915ca88cbcdd3 (2认同)

Sah*_*ati 6

希望这会帮助你.在下面的正则表达式中,我也在处理空间,

1. #[a-zA-Z0-9]{6}匹配字符串#090f00

2. rgb\((?:\s*\d+\s*,){2}\s*[\d]+\)这将匹配字符串rgb(10, 10, 20)

3. rgba\((\s*\d+\s*,){3}[\d\.]+\)这将匹配字符串rgba(100,100,100,0.9)

4. hsl\(\s*\d+\s*(\s*\,\s*\d+\%){2}\)将匹配字符串如hsl(10,30%,40%)

5. hsla\(\s*\d+(\s*,\s*\d+\s*\%){2}\s*\,\s*[\d\.]+\)这将匹配字符串hsla(120, 60%, 70%, 0.3)

正则表达式:

#[a-zA-Z0-9]{6}|rgb\((?:\s*\d+\s*,){2}\s*[\d]+\)|rgba\((\s*\d+\s*,){3}[\d\.]+\)|hsl\(\s*\d+\s*(\s*\,\s*\d+\%){2}\)|hsla\(\s*\d+(\s*,\s*\d+\s*\%){2}\s*\,\s*[\d\.]+\)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示