检测源代码是CSS / HTML / JavaScript

我想在某些来源上使用js美化 ,但是没有办法来检测它是什么types的来源。 有没有办法,粗糙或不检测,如果源是CSS,HTML,JavaScript或没有?

看着他们的网站,他们有这个看起来像它会弄清楚,如果它是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; } 

所以一个函数来testing这将返回types:

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

会有其他语言像Java那样我需要忽略的情况,但是对于css / html / js我可以使用美化器。

简答:几乎不可能。

– 感谢Katana的input

原因 :一个有效的HTML可以包含JS和CSS(通常是这样)。 JS可以同时包含css和html(即:var myContent ='<div> <style> CSS-Rules <script> JS Commands';)。 甚至CSS都可以包含在评论中。

所以写这个parsing器几乎是不可能的。 你不能轻易分开他们。

语言有如何写这些规则,你想要做的是颠倒build筑师的东西,并检查是否适用这些规则。 这可能是不值得的。


方法1

如果需求值得付出努力,你可以尝试在源代码上运行不同的parsing器,看看是否抛出错误。 即Java可能不是一个有效的HTML / JS / CSS,而是一个有效的Java代码(如果写得很好)。


方法2 – 感谢Bram的意见

但是,如果您知道源代码并假设这些代码不在代码中,则可以使用正则expression式尝试以下操作。

 <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> 

parsing

 $("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>"); } }); 

它做什么:parsing文本。

HTML

如果它包含“<”后跟br(或上面的任何其他标签),然后“>”,那么它是HTML。 (也包括一个支票,因为你可以比较js中的数字)。

CSS

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

JS

否则是JS。

你也可以这样做正则expression式:如果它包含'= {'或'function…'或'那么JS。 还要进一步检查正则expression式,以便更清楚地检查和/或提供白名单和黑名单(比如“var”,但是没有<或>,'function(asdsd,asdsad){assads')..)

布拉姆开始与我继续是:

 $("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是一个很好的参考&#x3002; 另请查看http://www.sitepoint.com/jquery-basic-regex-selector-examples/获取灵感&#x3002;

这取决于是否允许混合语言(如注释中提到的那样)(即在HTML中embedded了JS和CSS),或者这些是由于某些原因需要检测的单独文件。

一个严格的方法是从文件中构build一个树,其中每个节点将是一个语句(在Perl中,您可以使用HTML :: TreeBuilder )。 然后你可以parsing它,并与原始来源进行比较。 然后通过应用消除正则expression式来除去大块代码和分割语言。

另一种方法是search特定于语言的模式(我认为CSS在某些情况下只使用“* =”,因此如果您自己拥有“=”,则必须是JavaScript,embedded或不embedded)。 对于HTML你肯定可以检测标签像一些正则expression式

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

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

  var code = "<body>"; 

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

Interesting Posts