PHP 正则表达式:删除 CSS 规则,除非包含特定字符串

PHP RegEx: Remove CSS rules, except if contain specific string

我正在努力匹配并保留所有包含字符串 224,13,78.

的 CSS 规则

示例输入:

h1 {
    color: rgb(224,13,78);
}


h1 {
    display: block; /* Delete this whole block */
}


#test-color {
    color: rgb(224,13,78);
}    


.test-position {
    position: absolute; /* Delete this whole block */
}


.test-bg-color {
    background-color: rgba(224,13,78,0.5);
}


@media ( max-width: 1200px ) {
    .test-color {
        color: rgb(224,13,78);
    }

    .test-position {
        overflow: hidden; /* Delete this whole block */
    }
}

期望的输出:

h1 {
    color: rgb(224,13,78);
}


#test-color {
    color: rgb(224,13,78);
}


.test-bg-color {
    background-color: rgba(224,13,78,0.5);
}


@media ( max-width: 1200px ) {
    .test-color {
        color: rgb(224,13,78);
    }
}

有没有方便的正则表达式可以解决我的问题?

作为参考,我找到了这个解决方案,但它匹配 属性 名称,而不是值:

查找:\{.*(font-size\:\s*\d+px\;).*\}?

替换:\{ \}

还有这个 JavaScript 解决方案也是如此:

What is RegEx to remove css keeping font size

我也接受 JavaScript 解决方案,但 PHP 更可取。

提前谢谢大家。

试试下面的正则表达式:

\h*+[^\s{}][^{}]*{(?:[^{}](224,13,78)?)++[^{}]*+}(?(1)(*SKIP)(*F))\R*

live demo here

它的作用是尝试匹配 {...} 块中的字符序列 224,13,78。如果匹配,它会保存第一个捕获组中的值。然后稍后我们说如果第一个捕获组匹配成功,则跳过匹配的任何内容:

(?(1)(*SKIP)(*F))

否则整个匹配项不包含所需的字符,引擎将不会跳过它。我们现在只需要将匹配的块替换为空:

$css = preg_replace('~\h*+[^\s{}][^{}]*{(?:[^{}](224,13,78)?)++[^{}]*+}(?(1)(*SKIP)(*F))\R*~', '', $css);