Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何区分字符串中的代码是JS代码还是CSS代码?_Javascript_Node.js - Fatal编程技术网

Javascript 如何区分字符串中的代码是JS代码还是CSS代码?

Javascript 如何区分字符串中的代码是JS代码还是CSS代码?,javascript,node.js,Javascript,Node.js,我通过简单的POST请求接收代码字符串,我正在寻找一种聪明的方法(无需运行脚本本身)来区分它是javascript脚本还是css脚本,或者至少可以非常确定(我认为55%的可能性是其中之一) 这些不是文件这些是字符串,所以我没有任何关于字符串中代码的信息,没有文件,没有文件扩展,没有标题 你有什么建议/资源吗 非常感谢。您可以将返回的字符串包含在阻止执行它的块中(如果是JavaScript),并查看是否可以对其进行解析 function isJavaScript(str) { try

我通过简单的POST请求接收代码字符串,我正在寻找一种聪明的方法(无需运行脚本本身)来区分它是javascript脚本还是css脚本,或者至少可以非常确定(我认为55%的可能性是其中之一)

这些不是文件这些是字符串,所以我没有任何关于字符串中代码的信息,没有文件,没有文件扩展,没有标题

你有什么建议/资源吗


非常感谢。

您可以将返回的字符串包含在阻止执行它的块中(如果是JavaScript),并查看是否可以对其进行解析

function isJavaScript(str)
{
    try
    {
        Function('function(){' + str + '}');
        return true; // Looks like valid JS
    }
    catch (error)
    {
        // no valid JavaScript, may be CSS
        return false;
    }
}

我不认为这是100%万无一失的,但它可能适合您的目的。

如果这也必须适用于坏代码,我认为您最好的机会是搜索“典型CSS”和“典型JS”内容,并比较有多少是JS的代言人和有多少是CSS的代言人

JS的典型特征是它的,它的

CSS的典型结构是:[
分离的选择器]{[
分离的键值对]}

首先是一些实用程序,用于计算传递的字符串中有多少是特定语言的一部分。(非常基本的方法,因此也适用于坏代码)


这只是寻找包含ID和类的键值对和“典型”选择器,而不是整个结构,如果css结构被破坏或对于相当简单的正则表达式来说过于复杂,那么这应该是有益的。

您可以在其上运行。也许你可以在字符串中搜索纯css代码和元素,这样你就会知道这显然是css而不是javascript。让我们说“线通过”是CSS而不是JS。等等…。@t.niese如果脚本被破坏了怎么办?我必须接受他们,如果你需要接受破碎的css和js,那么就没有防弹的方法来测试它。您可以使用或创建一个错误tolorant js()和css解析器,并计算错误数和权重。也许可以使用某种统计方法,通过计算每种非字母数字字符的数量来计算错误数?OP说它还必须处理断开的代码。是的,它可能是js的一条断线,例如:(另外,我想避免evaling@sbaaaang如前所述,这只会尝试解析输入,而不会对其求值。但可以肯定的是,它不会识别格式错误或损坏的JavaScript。
//returns **kind of** a percentage of how much of the string has been identified as JS/CSS
function evaluateCode(pattern, commentPattern, correctionalFactor){
    correctionalFactor = +correctionalFactor || 1;
    return function(string){
        //removing comments and compacting whitespace.
        //this avoids false hits, and provides a better estimation of how much significant text/code we have (to compute the percentage)
        var t = string.replace(commentPattern || "", "").replace(/\s+/, " ");

        return correctionalFactor * (t.match(pattern) || []).reduce(sumLengths, 0) / t.length;
    }
}
var sumLengths = (acc, match) => acc + match.length;

var evaluateJS = evaluateCode(
    /\b(?:function|return|arguments|this|var|const|let|typeof|instanceof|Array|Object)\b|[+\-*/<>&|=]+|[()\[\]\{\}]/g, 
    /\/\*[\s\S]*\*\/|\/\/[^\n]*/g,
    1.5
);

var evaluateCSS = evaluateCode(
    /[a-z0-9\.#:\[\]=,\s-]+\{(?:\s*[a-z-]+\s*:[^;]+;?)*\s*\}/gi,
    /\/\*[\s\S]*\*\//g
);
var jsRatio = evaluateJS(string), 
    cssRatio = evaluateCSS(string);

//If there's less than 10% difference between the two estimations, I'd call it "unclear"
if(Math.abs(jsRatio - cssRatio) < .1){
    console.log("result is ambigious, but I tend more towards");
}
console.log("%s (probabilities: css %f%, js %f%)", cssRatio > jsRatio? "css": "js", cssRatio, jsRatio);