正则表达式将缺少的选择器添加到无效的CSS

use*_*497 8 css php regex pcre

我试图像这样转换无效的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;}
}
Run Code Online (Sandbox Code Playgroud)

我目前的正则表达式:

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

现场测试:

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

eli*_*ide 6

解决方案

你需要使用这个:

/(?<=\A|\})(\s*)\{/m
Run Code Online (Sandbox Code Playgroud)

用...来代替:

.missing-selector {
Run Code Online (Sandbox Code Playgroud)

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

这是一个regex101演示.

你的尝试失败的原因

这个

/([^a-z0-9\)\];\-_]*\{)/i
Run Code Online (Sandbox Code Playgroud)

不做你的想法.

  • ( 启动一个捕获组
  • [^a-z0-9\)\];\-_]需要比其它字符a-z,0-9,),],;,-,或_
  • * 零次或多次
  • \{ 要求 {
  • ) 结束捕获组

但是它没有a ^,所以它不依赖于一行的开头,也不验证在它之前发生的任何事情{(它应该只是字符串的开头,空格或a }).因此,它会匹配)];-_示例CSS中您有一系列空格或其他非字母数字字符(不包括)的所有位置:

regex101演示的截图

有关更全面的解释和示例匹配,请参阅此regex101演示.