我正在使用str_replace清理CSS输出,但是需要忽略具有已定义的开始和结束的某些字符串块。
忽略任何以:
开头的内容@media blah(this can be any value) {
要忽略的内容:
.class {
property: value;
}
并以:
结束}/*ends*/
并在该块之外执行str_replace:
.otherclass {property:value;}
PHP:
$output = str_replace("{", "{\n", $output);
$output = str_replace("}", "}\n", $output);
原因是@media块需要正确格式化的缩进,并且str_replace不应该触及哪个简单的返回可读行:
.otherclass {
property:value;
}
你会怎么用PHP说呢?
由于
答案 0 :(得分:1)
我还认为正则表达式是可行的,因为它们可以提供更多的灵活性。
我想天真的解决方案是首先从输出源获取所有这些事件,然后在剩余代码上使用str_replace然后将其放回。可能还会尝试一行一行地运行str_replace
同样,你最好的机会是使用正则表达式。您正在寻找的内容似乎是preg_replace,告诉它不要匹配@media
之前所遵循的任何内容参考文献:
答案 1 :(得分:1)
正则表达式不能计数,所以它们通常不适合解析(这就是你正在做的事情)。即,除非您可以限制输入格式多于完整的有效CSS集,否则您可能会发现某些情况不能按预期工作。
您还可以尝试完全解析CSS并使用规则来指定生成的CSS树,以指定输出数据的方式。这里显然有一个CSS解析器库:
http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html
答案 2 :(得分:1)
$string =
"@media blah(this can be any value) {
.class {
property: value;
}
}/*ends*/
.otherclass {property:value;}
.otherclass {property:value;}
@media blah(this can be any value) {
.class {
property: value;
}
}/*ends*/
.otherclass {property:value;}
.otherclass {property:value;}";
$arr = explode("\r", $string);
$ignore_block = false;
for ($i = 0; $i < count($arr); $i++)
{
if (strstr($arr[$i], '@media'))
$ignore_block = true;
elseif (strstr($arr[$i-1], '/*ends*/'))
$ignore_block = false;
if ($ignore_block == false)
{
$arr[$i] = str_replace("{", "{\n\t", $arr[$i]);
$arr[$i] = str_replace("}", "\n}\n", $arr[$i]);
}
}
file_put_contents("test.txt", implode("\n", $arr));
正则表达式不起作用,因为lookbehind不允许变长。尝试并循环浏览文件。