【问题标题】:PHP RegEx: Remove CSS rules, except if contain specific stringPHP RegEx:删除 CSS 规则,除非包含特定字符串
【发布时间】:2019-04-05 13:35:53
【问题描述】:

我正在努力匹配并保留所有包含字符串 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\;).*\}?

替换:\{ $1 \}

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

What is RegEx to remove css keeping font size

我也接受 JavaScript 解决方案,但最好使用 PHP。

提前谢谢大家。

【问题讨论】:

    标签: php regex replace preg-replace preg-match


    【解决方案1】:

    试试下面的正则表达式:

    \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);
    

    【讨论】:

    • 优秀的@revo,它有效,谢谢!您是否有想法清除每个匹配块内的任何其他属性并仅保留包含224,13,78 的行?输入:h1 { position: absolute; color: rgb(224,13,78); display: block; } 输出:h1 {color: rgb(224,13,78);}
    • 我的荣幸。只需使用此\s*[^\s:{}]+:((?!224,13,78)[^;])*+; 在上一个输出上运行另一个preg_replace。在此处查看现场演示regex101.com/r/Q9W14l/3
    • 太好了,你帮了我很多。再次感谢您!
    • 是的,但它也会删除前导换行符,这会降低 CSS 的可读性。请改用\h*[^\s{}][^{}]*{(?:[^}](224,13,78)?)+[^}]*}(?(1)(*SKIP)(*F))\R*
    • [^;]* 替换为[^;{}]*
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2012-03-15
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多