检测源是否为CSS / HTML / JavaScript

时间:2015-06-10 18:13:55

标签: javascript html css node.js code-analysis

我想在某些来源上使用js beautify但是没有办法检测它是什么类型的来源。有没有办法,粗略与否,检测来源是css,html,javascript还是没有?

看着他们的site他们看起来好像会弄清楚它是不是html:

function looks_like_html(source) {
    // <foo> - looks like html
    // <!--\nalert('foo!');\n--> - doesn't look like html
    var trimmed = source.replace(/^[ \t\n\r]+/, '');
    var comment_mark = '<' + '!-' + '-';
    return (trimmed && (trimmed.substring(0, 1) === '<' && trimmed.substring(0, 4) !== comment_mark));
}

只需看看它是css,javascript还是两者都没有。这是在node.js

中运行的

所以这段代码需要告诉我它是JavaScript:

var foo = {
    bar : 'baz'
};

这个代码需要告诉我它的CSS:

.foo {
    background : red;
}

因此测试它的函数将返回类型:

function getSourceType(source) {
    if (isJs) {
        return 'js';
    }
    if (isHtml) {
        return 'html';
    }
    if (isCss) {
        return 'css';
    }
}

在某些情况下,我需要忽略其他语言,例如Java,但对于css / html / js,我可以使用美化器。

2 个答案:

答案 0 :(得分:2)

简短回答:几乎不可能。

- 感谢Katana的输入

原因:有效的HTML可以包含JS和CSS(通常也是如此)。 JS可以包含css和html(即:var myContent ='&lt; div&gt;&lt; style&gt; CSS-Rules&lt; script&gt; JS Commands';)。甚至CSS也可以在评论中包含两者。

因此,编写解析器几乎是不可能的。你不能轻易将它们分开。

这些语言有关于如何编写它们的规则,你想要做的是反向构建一些东西并检查这些规则是否适用。这可能不值得努力。

方法1

如果需求是值得的,您可以尝试在源上运行不同的解析器,看看它们是否会抛出错误。即Java可能不是有效的HTML / JS / CSS,而是有效的Java代码(如果正确编写)。

方法2 - 感谢Bram的输入

但是,如果您非常了解源代码并假设代码中没有出现这些内容,则可以使用正则表达式尝试以下内容。

实施例

<code><div>This div is HTML var i=32;</div></code> 
<code>#thisiscss { margin: 0; padding: 0; }</code>
<code>.thisismorecss { border: 1px solid; background-color: #0044FF;}</code>
<code>function jsfunc(){ { var i = 1; i+=1;<br>}</code>

解析

$("code").each(function() {
    code = $(this).text();
   if (code.match(/<(br|basefont|hr|input|source|frame|param|area|meta|!--|col|link|option|base|img|wbr|!DOCTYPE).*?>|<(a|abbr|acronym|address|applet|article|aside|audio|b|bdi|bdo|big|blockquote|body|button|canvas|caption|center|cite|code|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frameset|head|header|hgroup|h1|h2|h3|h4|h5|h6|html|i|iframe|ins|kbd|keygen|label|legend|li|map|mark|menu|meter|nav|noframes|noscript|object|ol|optgroup|output|p|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video).*?<\/\2/)) {
      $(this).after("<span>This is HTML</span>");
   }
   else if (code.match(/(([ trn]*)([a-zA-Z-]*)([.#]{1,1})([a-zA-Z-]*)([ trn]*)+)([{]{1,1})((([ trn]*)([a-zA-Z-]*)([:]{1,1})((([ trn]*)([a-zA-Z-0-9#]*))+)[;]{1})*)([ trn]*)([}]{1,1})([ trn]*)/)) {
      $(this).after("<span>This is CSS</span>");
   }
   else {
      $(this).after("<span>This is JS</span>");
   }
});

它做什么:解析文本。

HTML

如果它包含'&lt;'等字符然后是br(或上面的任何其他标签),然后是'&gt;'那是它的HTML。 (也包括一个检查,因为你也可以比较js中的数字)。

CSS

如果它是由模式名称(可选)后跟的。或#后跟id或class后跟{你应该从这里得到它...在上面的模式中我还包括可能的空格和标签。

JS

否则就是JS。

你也可以像Regex一样:如果它包含'= {'或'function ...'或'那么JS。同时进一步检查正则表达式以更清楚地检查和/或提供白名单和黑名单(如'var'但不包括&lt;或&gt;,'function(asdsd,asdsad){assads}'..)

Bram从我继续的开始是:

$("code").each(function() {
   code = $(this).text();
   if (code.match(/^<[^>]+>/)) {
       $(this).after("<span>This is HTML</span>");
   }
   else if (code.match(/^(#|\.)?[^{]+{/)) {
     $(this).after("<span>This is CSS</span>");
   }
});

更多信息:

http://regexone.com是一个很好的参考。 另请查看http://www.sitepoint.com/jquery-basic-regex-selector-examples/获取灵感。

答案 1 :(得分:0)

这取决于您是否允许混合语言,如评论中所述(即在HTML中嵌入了JS和CSS),或者这些是您需要由于某种原因需要检测的单独文件。

严格的方法是从文件构建树,其中每个节点都是一个语句(在Perl中,您可以使用HTML::TreeBuilder)。然后你可以解析它并与原始源进行比较。然后继续应用消除正则表达式来清除代码块和拆分语言。

另一种方法是搜索特定于语言的模式(我认为CSS在某些情况下仅使用“* =”,因此如果你自己有“=”,则必须是JavaScript,嵌入或不嵌入)。 对于HTML,您肯定可以使用某些正则表达式检测标记,如

    if($source =~ m/(<.+>)/){}

基本上你需要考虑一些奇特的情况,比如用JavaScript来显示一些HTML代码

    var code = "<body>";

然后,这又取决于你所面临的情况,以及代码如何混合。