用于匹配CSS十六进制颜色的正则表达式

时间:2012-10-11 10:54:39

标签: php css regex colors hex

我正在尝试编写从CSS代码中提取所有十六进制颜色的正则表达式。

这就是我现在所拥有的:

代码:

$css = <<<CSS

/* Do not match me: #abcdefgh; I am longer than needed. */

.foo
{
    color: #cccaaa; background-color:#ababab;
}

#bar
{
    background-color:#123456
}
CSS;

preg_match_all('/#(?:[0-9a-fA-F]{6})/', $css, $matches);

输出:

Array
(
    [0] => Array
        (
            [0] => #abcdef
            [1] => #cccaaa
            [2] => #ababab
            [3] => #123456
        )

)

我不知道如何指定只匹配那些以标点符号,空格或换行符结尾的颜色。

5 个答案:

答案 0 :(得分:43)

由于十六进制颜色代码也可能由3个字符组成,因此您可以定义一个强制组和一组可选的字母和数字,因此长而精细的符号将为:

/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/

或者,如果你想要一个漂亮的短版本,你可以说你想要1组或2组3个字母数字字符,并且它们应该不区分大小写(/i)。

/#([a-f0-9]{3}){1,2}\b/i

答案 1 :(得分:20)

GolezTrol's answer的较短版本,可避免两次编写字符集:

/#([a-fA-F0-9]{3}){1,2}\b/

答案 2 :(得分:16)

接受的答案告诉你如何使用正则表达式,因为这是你的问题。但你真的不需要使用正则表达式。通常我会这样做:

if(ctype_xdigit($color) && strlen($color)==6){
    // yay, it's a hex color!
}

对于100.000次迭代:

正则表达式解决方案*:0.0802619457245秒

Xdigit with strlen:0.0277080535889秒

*:hex:([a-fA-F0-9]{6})

答案 3 :(得分:1)

尽管有这个问题的年龄,我还要修改以下内容:

^#([[:xdigit:]]{3}){1,2}$,其中[[:xdigit:]][a-fA-F0-9]的简写。

所以:
<?php preg_match_all("/^#(?>[[:xdigit:]]{3}){1,2}$/", $css, $matches) ?>

此处还值得注意的是使用非捕获组(?>...),以确保我们不会将数据存储在我们从未想过存储的内存中。

Try it online

答案 4 :(得分:0)

我不完全确定我是否正确,但如果你只想在CSS行的末尾匹配十六进制颜色:

preg_match_all('/#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})[\s;]*\n/',$css,$matches);

应该可以工作,我所做的只是添加可选的\s; char组(可选的分号和空格)和换行符(不是可选的),它似乎工作。
和@GolezTrol指出#FFF;也是有效的。

在此测试时:

$css = '/* Do not match me: #abcdefgh; I am longer than needed. */
.foo
{
    color: #CAB;
    background-color:#ababab;
}';
preg_match_all('/#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})[\s;]*\n/',$css,$matches);
var_dump($matches);

输出结果为:

array (array('#CAB;','#ababab;'))