2016-02-26 84 views
8

我试图改变无效的CSS是这样的:正则表达式来添加缺少的选择无效CSS

{color:red}

,并使其有效像这样:

.missing_selector{color:red}

范例CSS:

a { 
color:black; 
background-color:blue; 
} 

{color:red} 
<!-- TEST --> 

@media screen and (max-width:620px) { 
/* TEST 2 */ 
a.test {color:blue;} 
p[class="test2"] {color:green;} 
} 

我目前正则表达式:

/([^a-z0-9\)\];\-_]*\{)/i

现场测试:

http://www.phpliveregex.com/p/eMq

+0

只是一个提示,而不是答案,但也许这个库可以帮助:https://github.com/sabberworm/PHP-CSS-Parser我想,仅仅使用正则表达式的解决方案相当容易出错。 – Jan

+0

您可以尝试['/^\h*\K(?={)/m'](https://regex101.com/r/mC7pI5/1)并替换为'.missing_selector' –

回答

6

解决方案

您需要使用这样的:

/(?<=\A|\})(\s*)\{/m 

替换为:

.missing-selector { 

(?<=\A|\})可确保那里的{之前唯一(除空白,)是字符串或关闭}的开始。 (感谢Casimir et Hippolyte因为有指出的问题。)

Here's a regex101 demo

为什么你尝试失败

/([^a-z0-9\)\];\-_]*\{)/i 

不会做你的想法。

  • (开始捕获组
  • [^a-z0-9\)\];\-_]需要比a-z0-9)];-,或_
  • *零次或多次
  • \{要求{
  • 以外的字符
  • )结束捕获组

但它不具有^,所以它不依赖于行的开始,也没有验证{之前,无论发生什么事(这应该是唯一的字符串的开始,空格或})。其结果是,它会匹配所有的东西你在你的样品CSS有一系列的空格或(不含)];-_)其他非字母数字字符:

screenshot of regex101 demo

See this regex101 demo for a fuller explanation and example matches

+0

谢谢@EdCottrell,this正是我所需要的。我也很欣赏这个解释。 – user2266497