使用PHP Regex编辑CSS文件


Editing CSS file with a PHP Regex

我需要编辑我的css"字符串",并在每个选择器之前添加#holder选择器。例如

我想更改这个css字符串;

/* the css file with comments */ 
.header ul, .footer #div, .selector3 a
{
    box-shadow: none;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
}
.selector4, .selector5 ul > li, .selector6 a:hover
{
    text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
    -moz-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
    -webkit-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
}

作为

/* the css file with comments */ 
#holder .header ul, #holder .footer #div, #holder .selector3 a
{
    box-shadow: none;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
}
#holder .selector4, #holder .selector5 ul > li, #holder .selector6 a:hover
{
    text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
    -moz-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
    -webkit-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
}

我用这个正则表达式缩小了字符串,它工作得很好,所以你可以忽略注释行。

preg_replace('@({)'s+|(';)'s+|/'*.+?'*'/|'R@is', '$1$2 ', $css);

我正在搜索一个regex方法来完成它,但任何其他解决方案也将不胜感激。提前谢谢。

您可以这样做:

$pat = '~(?>/'*(?>[^*]++|'*(?!/))*+'*/|{[^}]*+})(*SKIP)(?!)|[^'s,{/][^,{/]++~';
$css = preg_replace($pat, '#holder $0', $css);

这样做的目的是避免大括号中的注释和内容,这样您就可以很容易地使用[^'s,{/][^,{/]++找到所有选择器。

为此,您将注释的子模式(即/'*(?>[^*]++|'*(?!/))*+'*/)和内容的子模式放在一组大括号内(即{[^}]*+}),然后强制模式失败,并禁止在匹配的子字符串中回溯。

CCD_ 4用于此。如果子模式稍后失败,(*SKIP)禁止在他左边的所有匹配内容中回溯。(?!)强制子模式失败("not following by nothing"总是false)。

您有两个选择:

要么替换每个类选择器,在这种情况下使用:

('.['w_'-]+)'b——示例:http://regex101.com/r/kM3dK9

或者你需要指定你要替换的:

('.(selector4|selector_5|other6))'b——示例:http://regex101.com/r/aC6dR3