【问题标题】:Detect if source is CSS/HTML/JavaScript检测源是否为 CSS/HTML/JavaScript
【发布时间】:2015-08-26 04:00:54
【问题描述】:

我想在某些来源上使用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,我可以使用美化器。

【问题讨论】:

  • 你期望的输出是什么。例如,如果我将一个字符串传递给确定它是什么的函数,您期望返回什么?
  • 这是否适用于嵌入了 JavaScript 和 CSS 的页面?您可以检查&lt;style&gt;&lt;script&gt;,但可能不是万无一失的。
  • 这可能是多个,具体取决于实现。如果它是一个确定类型的函数,那么它可以返回一个字符串('css''html''js'null),或者如果有单独的函数,那么它可以返回一个用于 isCss 函数的布尔值。
  • 我今天没有时间了,但是对于有兴趣解决这个问题的人,here's my start。不过,不确定如何快速检查 JS 的正则表达式。祝你好运!
  • @MitchellSimoens 好吧,这就是我的想法,这不会是一个简单的解决方案,甚至可能不可能(对于其他编程语言来说)......因为语法可能太相似了.

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


【解决方案1】:

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

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

另一种方法是搜索特定于语言的模式(我认为 CSS 在某些情况下只使用“*=”,因此如果您有“=”本身,则必须是 JavaScript,无论是否嵌入)。 对于 HTML,您肯定可以使用

之类的正则表达式检测标签
    if($source =~ m/(<.+>)/){}

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

    var code = "<body>";

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

【讨论】:

    【解决方案2】:

    简答:几乎不可能。

    - 感谢 Katana 的意见

    原因:一个有效的 HTML 可以包含 JS 和 CSS(通常也是如此)。 JS 可以同时包含 css 和 html(即:var myContent = 'CSS-RulesJS Commands';)。甚至 CSS 都可以包含在 cmets 中。

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

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


    方法 1

    如果要求值得付出努力,您可以尝试在源代码上运行不同的解析器,看看它们是否会抛出错误。 IE。 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

    如果它包含像“”,那么它就是 html。 (也包括一个检查,因为您也可以比较 js 中的数字)。

    CSS

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

    JS

    否则就是 JS。

    您也可以像这样执行 Regex:如果它包含 '= {' 或 'function...' 或 ' 那么 JS.还要进一步检查正则表达式以更清楚地检查和/或提供白名单和黑名单(如 'var' 但周围没有 ,'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/ 以获取灵感。

    【讨论】:

    • foo = "Hello" 是 JS 而不是 CSS。
    • 这应该是一个评论 - 或者至少需要改进。我认为 OP 已经弄清楚了你刚刚写下的内容。
    • Spencer 是对的,这就是我写正则表达式的原因。这不是解决方案,而是一个起点。
    • &gt; 在 HTML、CSS 和 JS 中。 &lt; 在 HTML 和 JS 中。 = 在 HTML 和 JS 中。 { 在 JS 和 CSS 中。所以你的出发点,说白了,很差
    • @Hogan 简单明了,对于各种 JS/CSS/HTML,它是行不通的。示例:var myTemplateHTML = "&lt;p&gt;html&lt;br/&gt;&lt;/p&gt;"; 是 JS,而不是 HTML。即使是包含 HTML 的 CSS 注释(在某些 CSS 注释系统中可能)也会破坏它。
    猜你喜欢
    • 2011-02-04
    • 2018-10-10
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2011-10-13
    • 2013-06-05
    相关资源
    最近更新 更多