PHP忽略str_replace中的字符串块

时间:2012-04-24 04:04:26

标签: php regex

我正在使用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说呢?

由于

3 个答案:

答案 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不允许变长。尝试并循环浏览文件。