使用javascript检查css文件中的选择器重复项

使用javascript检查css文件中的选择器重复项,javascript,css,node.js,regex,Javascript,Css,Node.js,Regex,我有一个带有CSS选择器的字符串,如下所示(实际上是一个文件,但在我读入后它将是一个字符串): 我需要做的是检查选择器(.u-tr部分),确保没有冲突/重复 比如: let selectorArray = process(stringOfCSS); 选择器阵列现在应包含: ['u-br', 'u-mr', etc] 此时,我只需要确保数组中的所有条目都是唯一的,我知道如何做到这一点。您可以编写类似的代码来循环并逐个提取每个类名。当它找到每个类名时,如果尚未找到该类名,则将其添加为输出的键,否

我有一个带有CSS选择器的字符串,如下所示(实际上是一个文件,但在我读入后它将是一个字符串):

我需要做的是检查选择器(
.u-tr
部分),确保没有冲突/重复

比如:

let selectorArray = process(stringOfCSS);
选择器阵列现在应包含:

['u-br', 'u-mr', etc]

此时,我只需要确保数组中的所有条目都是唯一的,我知道如何做到这一点。

您可以编写类似的代码来循环并逐个提取每个类名。当它找到每个类名时,如果尚未找到该类名,则将其添加为
输出的键,否则它将增加
的值输出[classname]
。返回值大于1的任何内容都将是重复属性

let input=`.u-top-right{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
u-tr{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}右上角{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
u-tr{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}右上角{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
u-tr{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}右上角{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
.随机类名{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}`
常量rgx=/\.(.+?)\s*\{\s*/,,
输出={}
让比赛
而((match=rgx.exec(input))){
让classname=match[1]
如果(!output[classname])output[classname]=0
++输出[类名]
输入=输入。替换(rgx“”)
}

console.log(output)
也许这可以帮助您。首先,我在第一个样式表中创建css规则数组:
document.styleSheets[0]。cssRules

接下来,我将迭代这些规则,如果规则以“.”开头,我将使用console.log。无需检查
{
。我希望这会对您有所帮助

let stylesArray=Array.from(document.styleSheets[0].cssRules);
stylesArray.forEach(规则=>{
if(rule.selectorText.substring(0,1)=“){console.log(rule.selectorText)}
})
.u-右上角{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
u-tr{
位置:绝对!重要;
顶部:0!重要;
右:0!重要;
}
#测试{显示:无}
.test{display:flex;}
让s=`.u-br,.u-nr{
废话
}
u-tr{
废话,废话
}`;
让选择器=s.match(/\.-?[\u a-zA-Z]+[\w-]*(?=[^{}]*\{)/g);
函数具有重复项(数组){
返回(新集合(数组)).size!==array.length;
}
log(hasDuplicates(选择器));//false;
//找到重复的
var sorted_arr=选择器.slice().sort();
var结果=[];
对于(变量i=0;i
你能把所有缩写的选择器按字母顺序放在一个地方吗?所以你要做的就是找到一个正则表达式来提取所有的选择器?目前还不清楚你要的是什么。除非它意味着别的。试试
\.-?[\u a-zA-Z]+[\w-]*(?=[^{}]*\{)
。请参阅此处的live demo如果您将其全部放在一个字符串中,您可以使用简单的正则表达式删除重复项。但是,这种方法将从上到下删除重复项。类似于查找
/\(选择器-[^{}]*?)\s*\{[^{}]*\}(?[\s\s]*.\1\s*{[^{}]*})/
nothing替换。它最终只包含唯一的选择器。@Ole-这是一个很好的备忘单。当您准备全面探索正则表达式时,请使用此备忘单。它将在几周内让您从新手变成专家。它很接近,但不幸的是,我不能使用它,因为我需要在节点中作为构建过程的一部分运行它。
['u-br', 'u-mr', etc]
let s = `.u-br, .u-nr {
    blah blah
}

.u-tr {
    blah .blah
}`;
let selectors = s.match(/\.-?[_a-zA-Z]+[\w-]*(?=[^{}]*\{)/g);

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}
console.log(hasDuplicates(selectors));//false;

//Find the duplicates
var sorted_arr = selectors.slice().sort();

var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1] == sorted_arr[i]) {
        results.push(sorted_arr[i]);
    }
}

console.log(results);