我需要检查用户输入是否为有效的CSS语法(输入字符串基本上是一个CSS文件)。它可以包含类、选择器、!important
等。
我没有开始工作,因为我希望已经有一些正则表达式语法可用,这样我就不必从头开始。
我尝试过谷歌搜索,但我找到的都是部分匹配的字符串,而不是验证所有可能的CSS的正则表达式。
我需要检查用户输入是否为有效的CSS语法(输入字符串基本上是一个CSS文件)。它可以包含类、选择器、!important
等。
我没有开始工作,因为我希望已经有一些正则表达式语法可用,这样我就不必从头开始。
我尝试过谷歌搜索,但我找到的都是部分匹配的字符串,而不是验证所有可能的CSS的正则表达式。
好的,我想出了一个匹配有效CSS样式的正则表达式。
([#.@]?[\w.:> ]+)[\s]{[\r\n]?([A-Za-z\- \r\n\t]+[:][\s]*[\w .\/()\-!]+;[\r\n]*(?:[A-Za-z\- \r\n\t]+[:][\s]*[\w .\/()\-!]+;[\r\n]*(?2)*)*)}
这里有一个工作示例:
请注意... 在查看上面的示例链接后,您会发现这个正则表达式适用于常见的基本CSS2样式,但是,为了匹配所有CSS3样式变化,涉及到http://www.w3.org/TR/css3-syntax/#detailed-grammar,这个正则表达式需要进行一些调整... 上面的正则表达式是一个起点..
url()
中不允许使用完整的URL。 - Dalinif
条件。 - John对Bryan的回答进行补充,并添加一条注释
出现了错误 (?2)
.class, .class2 {...}
.class-name, .class_name
.class {}
宽度:100%;
背景:url("/img.jpg");
const multi = /((?:^\s*)([\w#.@*,:\-.:>,*\s]+)\s*{(?:[\s]*)((?:[A-Za-z\- \s]+[:]\s*['"0-9\w .,\/()\-!%]+;?)*)*\s*}(?:\s*))/mi
const example = `
div.css-class-10_9::hover, .active {
width: 100%;
background: rgba(1.0,0,1,1);
background-url: url("http://img.jpg");
}
div.css-class-10_9::hover,
.active {
width: 100%;
background: rgba(1.0,0,1,1);
background-url: url("http://img.jpg");
}
html {
background: white;
}
`
let out = example.replace(multi, '')
// "
// div.css-class-... {...}
// html {...}
// "
out = out.replace(multi, '')
// "html {...}"
out = out.replace(multi, '')
// ""
const global_re = /((?:^\s*)([\w#.@*,:\-.:>,*\s]+)\s*{(?:[\s]*)((?:[A-Za-z\- \s]+[:]\s*['"0-9\w .,\/()\-!%]+;?)*)*\s*}(?:\s*))/gmi
example.replace(global_re, '');
// ""
example.replace(global_re,'$1') // group 1 all css
//
// div.css-class-...{
// width...
// rest_css...
// }
//
// ...
//
// html {
// ...
// }
类名
example.replace(global_re,'$2\n\n') // group 1 all class names
// "
// div.css-class-10_9::hover, .active
//
// div.css-class-10_9::hover,
// .active
//
// html
// "
example.replace(global_re,'$3\n')
// "
// width: 100%;
// background: rgba(1.0,0,1,1);
// background-url: url("http://img.jpg");
//
//
// width: 100%;
// background: rgba(1.0,0,1,1);
// background-url: url("http://img.jpg");
//
//
// background: white;
//
// "
https://regex101.com/r/fK9mY3/55
(免责声明:这绝对不是验证 CSS 的方法)
例如:'............a {}' 将返回 true。
.test{ fail:red;}
是有效的吗? - HamZa