使用PHP Regex编辑CSS文件

时间:2013-12-08 00:48:25

标签: php css regex file minify

我需要编辑我的css“string”并在每个选择器之前添加#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;
}

as

/* 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);

我正在搜索正则表达式方法来执行此操作,但任何其他解决方案也将不胜感激。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您有两种选择:

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

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

或者您需要指定要替换的那些:

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

答案 1 :(得分:1)

你可以这样做:

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

我们的想法是避免使用大括号内的注释和内容,然后您可以使用[^\s,{/][^,{/]++轻松找到所有选择器。

为了做到这一点,你将一个子模式放在一个组中(即/\*(?>[^*]++|\*(?!/))*+\*/)和大括号内的内容(即{[^}]*+}),然后你强制模式失败并禁止回溯匹配的子串。

(*SKIP)(?!)用于此目的。如果子模式稍后失败,(*SKIP)禁止回溯左侧所有匹配的内容。 (?!)强制子模式失败(“后面没有任何内容”总是为假)。