35

CSS コードからすべての 16 進数の色を抽出する正規表現を作成しようとしています。

これは私が今持っているものです:

コード:

$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
        )

)

句読点、空白、または改行で終わる色のみが一致するように指定する方法がわかりません。

4

5 に答える 5

58

16 進数のカラー コードも 3 文字で構成される場合があるため、必須のグループとオプションの文字と数字のグループを定義できるため、長くて精巧な表記は次のようになります。

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

または、素敵で短いバージョンが必要な場合は、3 文字の英数字の 1 つまたは 2 つのグループが必要であり、大文字と小文字を区別せずに一致させる必要があると言うことができます ( /i)。

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

正規表現エンジンがこの posix 文字クラスをサポートしている場合は、代わりに と[a-f0-9]書くこともできます。[[:xdigit:]]この場合/i、最後の をスキップできます。式全体が 2 文字増えるだけですが、間違いなくより説明的になります。

/#([[:xdigit:]]{3}){1,2}\b/
于 2012-10-11T10:58:21.160 に答える
33

それがあなたの質問だったので、受け入れられた答えは正規表現でそれを行う方法を示しています。しかし、これに正規表現を使用する必要はありません。通常、これは私がそれを行う方法です:

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

100.000 回の繰り返しの場合:

正規表現ソリューション *: 0.0802619457245 秒

strlen の Xdigit: 0.0277080535889 秒

*: 16 進数:([a-fA-F0-9]{6})

于 2016-11-10T11:14:19.403 に答える
1

これが正しいかどうかは完全にはわかりませんが、CSS 行の最後にある 16 進数の色のみを一致させたい場合は、次のようにします。

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;'))
于 2012-10-11T11:00:07.603 に答える