提示:您可以先修改部分代碼再運行
javascript 給程式碼高亮設定代碼<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jslib測試</title><style type="text/css">pre { color:black; }span.hl_js_kw { color: blue; font-weight:bold;}span.hl_js_mcm { color:green; }span.hl_js_scm { color:gray; }span.hl_js_s { color:green; }span.hl_js_reg { color: red; }span.hl_js_num { color: red; }span.hl_js_typ { color: #9900CC; }</style><script type="text/javascript">function $(id) {return document.getElementById(id);}function btn_click() {var formats = [];formats[JSEngine.TYPE_KEYWORD] = { "start": "<span class="hl_js_kw">", "end": "</span>" };formats[JSEngine.TYPE_MUTILCOMMENT] = { "start": "<span class="hl_js_mcm">", "end": "</span>" };formats[JSEngine.TYPE_SINGLECOMMENT] = { "start": "<span class="hl_js_scm">", "end": "</span>" };formats[JSEngine.TYPE_STRING] = { "start": "<span class="hl_js_s">", "end": "</span>" };formats[JSEngine.TYPE_REGEXP] = { "start": "<span class="hl_js_reg">", "end": "</span>" };formats[JSEngine.TYPE_NUMBER] = { "start": "<span class="hl_js_num">", "end": "</span>" };formats[JSEngine.TYPE_TYPES] = { "start": "<span class="hl_js_typ">", "end": "</span>" };var pre = $("codePre");var area = $("codeArea");var engine = new JSEngine();var code = area.value.replace(/</g, "<").replace(/>/g, ">");var dt = new Date();str = engine.parseSyntax(code, formats);$("msg").innerHTML = "共有" + code.length + "個字元, 解析花時" + (new Date().getTime() - dt.getTime()) + "ms";str = str.replace(/^(t+)/gm, function(m) {return (new Array(m.length + 1)).join(" ");});str = str.replace(/^( +)/gm, function(m) {return (new Array(m.length + 1)).join(" ");});str = str.replace(/r?n/g, "<br/>");pre.innerHTML = str;}window.onload = function() {$("btn").onclick = btn_click;}var keywords = "Array|arguments|Boolean|Date|Enumerator|Error|Function|Global|Math|Number|Object|RegExp|String|break|delete|function|return|typeof|case|do|if|switch|var|catch|else|in|this|void|continue|false|instanceof|throw|while|debugger|finally|new|true|with|default|for|null|try|abstract|double|goto|native|static|boolean|enum|implements|package|super|byte|export|import|private|synchronized|char|extends|int|protected|throws|class|final|interface|public|transient|const|float|long|short|volatile";var types = "Anchor|Applet|Area|Arguments|Array|Boolean|Button|Checkbox|Collection|Crypto|Date|Dictionary|Document|Drive|Drives|Element|Enumerator|Event|File|FileObject|FileSystemObject|FileUpload|Folder|Folders|Form|Frame|Function|Global|Hidden|History|HTMLElement|Image|Infinity|Input|JavaArray|JavaClass|JavaObject|JavaPackage|JSObject|Layer|Link|Math|MimeType|Navigator|Number|Object|Option|Packages|Password|Plugin|PrivilegeManager|Random|RegExp|Screen|Select|String|Submit|Text|Textarea|URL|VBArray|Window|WScript|window";function JSEngine(){};JSEngine.TYPE_KEYWORD = 0;JSEngine.TYPE_MUTILCOMMENT = 1;JSEngine.TYPE_SINGLECOMMENT = 2;JSEngine.TYPE_STRING = 3;JSEngine.TYPE_REGEXP = 4;JSEngine.TYPE_NUMBER = 5;JSEngine.TYPE_TYPES = 6;var _p = JSEngine.prototype;var _p = JSEngine.prototype;var _p = JSEngine.prototype;_p.parseSyntax = function(code, formats) {var buff = [], codeBuff = code, codeLen = code.length, sIdx = 0, buffIdx = 0, objBuff = [];var stopIdx = codeLen, searchResult = null, result = null, len = 0;var flgs = { "string1": true, "string2": true, "mutilcm": true, "singlecm": true, "regcm": true };while(flgs["string1"] || flgs["string2"] || flgs["mutilcm"] || flgs["singlecm"] || flgs["regcm"]){searchResult = null;codeLen = code.length;stopIdx = codeLen;if (flgs["string1"]) {result = searchString(code, codeLen, sIdx, stopIdx, """);switch(result) {case null: flgs["string1"] = false; break;case -1: break;default: {searchResult = result;searchResult[3] = JSEngine.TYPE_STRING;stopIdx = result[0];break;}}}if (flgs["string2"]) {result = searchString(code, codeLen, sIdx, stopIdx, "'");switch(result) {case null: flgs["string2"] = false; break;case -1: break;default: {searchResult = result;searchResult[3] = JSEngine.TYPE_STRING;stopIdx = result[0]; break;}}}if (flgs["mutilcm"]) {result = searchMutilComments(code, codeLen, sIdx, stopIdx);switch(result) {case null: flgs["mutilcm"] = false; break;case -1: break;default: {searchResult = result;searchResult[3] = JSEngine.TYPE_MUTILCOMMENT;stopIdx = result[0]; break;}}}if (flgs["singlecm"]) {result = searchSingleComments(code, codeLen, sIdx, stopIdx);switch(result) {case null: flgs["singlecm"] = false; break;case -1: break;default: {searchResult = result;searchResult[3] = JSEngine.TYPE_SINGLECOMMENT;stopIdx = result[0]; break;}}}if (flgs["regcm"]) {result = searchRegexp(code, codeLen, sIdx, stopIdx);switch(result) {case null: flgs["regcm"] = false; break;case -1: break;default: {searchResult = result;searchResult[3] = JSEngine.TYPE_REGEXP;break;}}}if (searchResult == null) {buff.push(code);break;} else {/*len = searchResult[1] - searchResult[0] + searchResult[2];if (searchResult[0] != 0) {buff.push(code.substring(sIdx, searchResult[0]))}buff.push([code.substring(searchResult[0], searchResult[1] + searchResult[2]), searchResult[3]]);sIdx = searchResult[1] + searchResult[2];code = code.substr(sIdx);sIdx = 0;*/len = searchResult[1] - searchResult[0] + searchResult[2];if (searchResult[0] != 0) {buff.push(code.substring(sIdx, searchResult[0]))}objBuff.push([code.substring(searchResult[0], searchResult[1] + searchResult[2]), searchResult[3]]);buff.push("<_" + (objBuff.length - 1) + "_>");sIdx = searchResult[1] + searchResult[2];code = code.substr(sIdx);sIdx = 0;}}//dt = new Date();/*for (i = 0, len = buff.length; i < len; i++) {if (typeof(buff[i]) == "string") {reg = new RegExp("b(" + keywords + ")b", "gm");result = formats[JSEngine.TYPE_KEYWORD].start + "$1" + formats[JSEngine.TYPE_KEYWORD].end;buff[i] = buff[i].replace(reg, result);reg = new RegExp("b(" + types + ")b", "gm");result = formats[JSEngine.TYPE_TYPES].start + "$1" + formats[JSEngine.TYPE_TYPES].end;buff[i] = buff[i].replace(reg, result);reg = /b([+-]?(?:d+(?:.d*)?(?:e[+-]?d+)?|0x[dA-F]+))b/gim;result = formats[JSEngine.TYPE_NUMBER].start + "$1" + formats[JSEngine.TYPE_NUMBER].end;buff[i] = buff[i].replace(reg, result);} else {buff[i] = ([formats[buff[i][1]].start, buff[i][0], formats[buff[i][1]].end]).join("");}}*///alert(new Date().getTime() - dt.getTime());buff = buff.join("");reg = new RegExp("b(" + keywords + ")b", "g");result = formats[JSEngine.TYPE_KEYWORD].start + "$1" + formats[JSEngine.TYPE_KEYWORD].end;buff = buff.replace(reg, result);reg = new RegExp("b(" + types + ")b", "g");result = formats[JSEngine.TYPE_TYPES].start + "$1" + formats[JSEngine.TYPE_TYPES].end;buff = buff.replace(reg, result);reg = /b([+-]?(?:d+(?:.d*)?(?:e[+-]?d+)?|0x[dA-F]+))b/gim;result = formats[JSEngine.TYPE_NUMBER].start + "$1" + formats[JSEngine.TYPE_NUMBER].end;buff = buff.replace(reg, result);buff = buff.replace(/<_(d+)_>/g, function(m, n) {return formats[objBuff[n][1]].start + objBuff[n][0] + formats[objBuff[n][1]].end;});//return buff.join("");return buff;}function searchMutilComments(code, codeLen, sIdx, stopIdx) {var startIdx = -1, endIdx = -1;if (codeLen < 4) return null;startIdx = code.indexOf("/*", sIdx);if (startIdx == -1) return null;if (startIdx > stopIdx) return -1;endIdx = code.indexOf("*/", startIdx + 2);if (endIdx == -1) return null;return [startIdx, endIdx, 2];}function searchString(code, codeLen, sIdx, stopIdx, ch) {var at = sIdx, i = 0, isEscape = false, startIdx = -1, endIdx = -1, len = 0;var isMutilLine = false, fragments = null, isContinueSearch = false, tCh = null, fragm = null, fragmLen = 0;if (codeLen < 2) return null;while(true) {startIdx = code.indexOf(ch, at);if (startIdx == -1) return null;if (startIdx > stopIdx) return -1;if (startIdx > at) {i = startIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {at = startIdx + 1;if ((at + 2) > stopIdx) return -1;continue;}}break;}if (startIdx > stopIdx) return -1;at = startIdx + 1;lab_searchString:while(true) {while(true) {endIdx = code.indexOf(ch, at);if (endIdx == -1) return null;if (endIdx > at) {i = endIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {at = endIdx + 1;continue;}}break;}isMutilLine = code.indexOf("n", startIdx + 1);if (isMutilLine != -1 && isMutilLine < endIdx) {fragments = code.substring(startIdx + 1, endIdx).split("n");len = fragments.length - 1;for (i = 0; i < len; i++) {fragm = fragments[i];fragmLen = fragm.length;tCh = fragm.charCodeAt(fragmLen - 1) == 13 ? fragm.charAt(fragmLen - 2) : fragm.charAt(fragmLen - 1);if (tCh != "") {if (endIdx > stopIdx) return -1;if ((endIdx + 1) == stopIdx) return -1;startIdx = endIdx;at = startIdx + 1;continue lab_searchString;}}}break;}return [startIdx, endIdx, 1];}function searchSingleComments(code, codeLen, sIdx, stopIdx) {var at = sIdx, i = 0, isEscape = false, startIdx = -1, endIdx = -1;if (codeLen < 2) return null;while(true) {startIdx = code.indexOf("//", at);if (startIdx == -1) return null;if (startIdx > stopIdx) return -1;if (startIdx > at) {i = startIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {at = startIdx + 2;if ((at + 3) > stopIdx) return -1;continue;}}break;}endIdx = code.indexOf("n", startIdx + 2);return [startIdx, endIdx == -1 ? code.length : endIdx, 0];}function searchRegexp(code, codeLen, sIdx, stopIdx) {var at = sIdx, i = 0, isEscape = false, tmpResult = null, ch = null, endAt = 0, tmpStr = null;var startIdx = -1, tSIdx = -1, eStopIdx = -1, endIdx = -1, escapeFlg = "", bIdx = -1, eIdx = -1, bAt = -1, eAt = -1;function sEnd(code, startIdx) {var endIdx = -1, endAt = startIdx, i = 0, isEscape = false;while(true) {endIdx = code.indexOf("/", endAt);if (endIdx == -1) return -1;i = endIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {endAt = endIdx + 2;continue;} else {return endIdx;}}}if (codeLen < 2) return null;while(true) {startIdx = code.indexOf("/", at);if (startIdx == -1) return null;if (startIdx > stopIdx) return -1;switch(code.charAt(startIdx + 1)) {case null :case "r":case "n":case "*":case "/": {at = startIdx + 2;if ((at + 2) > stopIdx) return -1;continue;}}if (startIdx > at) {i = startIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {at = startIdx + 2;if ((at + 3) > stopIdx) return -1;continue;}}tmpResult = code.indexOf("n", startIdx + 1); //不允許在不同行eStopIdx = tmpResult == -1 ? codeLen : tmpResult;tmpStr = code.substring(0, startIdx);if(!/(?:[!=(,:+-*%&|!~[/n;{}?rn]|typeof|in|instanceof|void|new|return|do|else|throw|^)[ t]*$/.test(tmpStr)) {at = startIdx + 1;continue;}endAt = (code.charAt(startIdx + 1) == "[" ? 1 : 2) + startIdx;endIdx = sEnd(code, endAt);if (endIdx == -1) return null;bAt = startIdx + 1;while(true) {bIdx = code.indexOf("[", bAt);if (bIdx == -1) break;i = bIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {bAt = bIdx + 1;continue;}if (bIdx > endIdx) break;eAt = bIdx + 2;while(true) {eIdx = code.indexOf("]", eAt);if (eIdx == -1) break;i = eIdx, isEscape = false;while(code.charAt(--i) == "") isEscape = !isEscape;if (isEscape) {eAt = eIdx + 1;continue;}if (eIdx > endIdx) {endAt = eIdx + 1;endIdx = sEnd(code, endAt);if (endIdx == -1) return null;}bAt = eIdx + 1;break;}}if (endIdx > eStopIdx) {at += 1;continue;}break;}return [startIdx, endIdx, 1];}</script></head><body><p id="msg">請輸入代碼測試一下,如果是PHP輸出,請使用htmlspecialchars對其編碼</p><textarea id="codeArea" >// test 1 function myfun(id) {/* this is mutilcomments "string" keyword: function */var str = "this is a string, /*fasasdf*/ //fdsasdf /^reg/";var reg = /^fdadfasdf$/ig;return "myvalue"; // hahah}//test 2if(str.match(/(?:(?:[!=(,:]|[|n)[ t]*/$)|^n?[t ]*/$/)){}//test 3a = 1b = 2g = {test:function(){return 1}}c = a///**//b/g.test();alert(c);// test 4function t4(test) {return (test/*/* //' "{ ;*/ && // /* // " ' { ; test &&" /* // " ' { ;" &&' /* // " ' { ;' &&test);}// test 5var rexT5 = /[/][+]([Ss]*?)(?:[+][/]|$)|[/][/](.*)|"((?:"|[^"])*)"|'((?:'|[^'])*)'/g; //正則var nu = 1/2/3 //這是除法var str = "123//456".replace(/[/]/g,'')+1/2/3; //commentvar o=[/re/,(/re/),typeof /re/,function(){return /re/},'o' in /re/,1 / /re/,!/re/];
提示:您可以先修改部分代碼再運行