【问题标题】:Remove CSS delcarations with PHP使用 PHP 删除 CSS 声明
【发布时间】:2018-02-17 17:20:00
【问题描述】:

我只是想知道如何从 PHP 中的字符串中删除 CSS 声明。

字符串是什么样的?

body, html{
    font-family:'Poppins', sans-serif;
    background-color:white;
    overflow-x:hidden;
}
body{
    overflow-y:hidden;
}
header{
    position:relative;
    z-index:2;
}

结果应该是什么?

body, html{

}
body{

}
header{

}

我有

$string = 'body, html{ overflow-x:hidden; } body{overflow-y:hidden; } header{ position:relative; z-index:2; }'; 

并且需要得到

$string = 'body, html{} body{} header{}'; 

【问题讨论】:

  • 对不起,这既是 Too Broad 又是 Unclear
  • 您是想在文件发送到浏览器之前编辑文件中的 CSS,还是说您想找到一种方法在访问浏览器时忽略这些块中的 CSS ???
  • 使用问题下方的编辑链接将其添加到您的问题中
  • 不,只有字符串 $string = 'body, html{ overflow-x:hidden; } 身体{溢出-y:隐藏; } 标题{ 位置:相对; z-索引:2; }';并且需要得到 $string = 'body, html{} body{} header{}';
  • $string = 'body, html{} body{} header{}'; 似乎会得到想要的结果

标签: php regex replace


【解决方案1】:

试试这个正则表达式

preg_replace("/\{.*\}/sU", "{}", $input_lines);

【讨论】:

  • 如果有人可以提供解释,作为对为什么这是不正确的反对意见,那将很有帮助
  • 事情就是这样。它是正确的,直到你最不怀疑它并且由于边缘案例而失败 - 而且有相当多的。 github.com/sabberworm/PHP-CSS-Parser/tree/master/tests/files(如问题下的 cmets 所述)。我们这些热爱 StackOverflow 并寻求保护它的人都知道,答案将被无数未来的研究人员查看和使用。我们必须在合理的范围内广泛思考什么是对的,什么是错的。这种模式在许多边缘情况下都会失败——这就是你被否决的原因。测试:regex101.com/r/Gkz61o/2
  • 感谢您的回复。因此,如果我编辑问题以表明这不是正确的方法并提供到打包的 css 解析器的链接,这将是正确的吗?如果答案将被忽略,我只是不理解直接回答用户的动机。只要提供了一个灵魂并且用户很高兴,其他人仍然能够提供他们自己的解决方案,而不是仅仅投反对票,或者如果他们担心可以通过任何方式编辑我的解决方案?然而,留下反对票而不提供任何反馈,我看不出在任何方面都是建设性的。
  • 我可以同情。我经常被不加评论的反对票击中。我还想声明我没有投反对票。是的,作为一般规则,当我为不能可靠地使用正则表达式的情况提供正则表达式方法时,我会写一个免责声明,说明我的方法的不稳定性。我要指出的是,“Try This”的答案在 StackOverflow 上确实让我感到厌烦——它们基本上是纯代码的答案,对教育 OP 和未来的研究人员几乎没有什么帮助。如果您想冒获得支持的风险,我建议您扩展并解释您的答案。
  • 感谢您的回复。我不介意建设性的反馈,我只是不明白任何人如何从反对票和缺乏解释中受益。既然已经解释过了,并举了一个例子,我明白这是错误的,我可以调整到更合适的答案。
【解决方案2】:

别人的警告是有根据的。尽管可以设计正则表达式模式,但它仍然容易受到边缘情况和字符异常的影响,而这些异常情况会默默地破坏方法。

以下是我精心设计的创可贴解决方案。它使用替代和递归来防止嵌套括号、带注释的花括号和存在于带引号的子字符串中的大括号。

我确信我没有考虑所有可能的猴子扳手,但这是一个我不想再花时间在上面的兔子洞。

代码:(Demo with two sample inputs)

echo preg_replace('~(?:\s*/\*.*?\*/\s*)|\{\K(?:\'[^\']*\'|"[^"]*"|/\*.*?\*/|(?:(?R)|[^}]))*~', '', $css);

或者玩玩这个Pattern Demo

【讨论】:

  • @Jarek 我已经改进了我的正则表达式模式以更好地涵盖一些边缘情况。也就是说,我必须重申,即使是这种谨慎的模式也会有缺陷。
  • @Jarek Juakali 似乎想删除而不是改进他/她的答案,但由于绿色勾号而不能。如果你去掉勾号,答案就可以去掉了。
猜你喜欢
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2021-06-25
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多