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

Hem*_*ulo 32 css php regex hex colors

我正在尝试编写从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);
Run Code Online (Sandbox Code Playgroud)

输出:

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

)
Run Code Online (Sandbox Code Playgroud)

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

Gol*_*rol 49

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

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

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

/#([a-f0-9]{3}){1,2}\b/i
Run Code Online (Sandbox Code Playgroud)

  • 这些变化毫无意义.这是一个更简单的版本:`/#([a-fA-F0-9]){3}(([a-fA-F0-9]){3})?\ b /` (2认同)
  • @evolross它匹配字符串中的颜色代码。它将与#FFF#FF中的#FFF相匹配,但不匹配最后一部分。如果要匹配确切的字符串,可以在正则表达式中添加字符串边界“ anchors”,使其类似于“ ^#([a-f0-9] {3}){1,2} \ b $`。有关详细信息,请参见`https:// regex101.com / r / LZJr63 / 1`。 (2认同)

rob*_*nst 21

较短版本的GolezTrol的答案可以避免两次编写字符集:

/#([a-fA-F0-9]{3}){1,2}\b/
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`i`不区分大小写的匹配标志使它更短.`/#([A-f0-9] {3}){1,2}\B/i` (3认同)

mod*_*odu 20

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

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

对于100.000次迭代:

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

带有strlen的Xdigit:0.0277080535889秒

*:十六进制: ([a-fA-F0-9]{6})

  • 我做了,只是为了告诉你哪种方法更快. (11认同)
  • 这个答案值得更多的赞成.这些代码不仅快3倍,而且更短,更容易理解. (6认同)