/*regexp = [ B specifies the very beginning of the string [ 0 v specifies a variable 1 1 specifies the variable number 2 must occur at least this times 3 must occur at most this times 4 5 specifies next occuring RE 5 true specifies if an OR exists after variable ] [ 0 must occur at least this times 1 must occur at most this times (blank = infinity) 2 matched characters 3 non-matched characters 4 current repeat times ] OR specifies that the matched text can = the previous OR next array [ -1 specifies the end of variable one true specifies if an OR exists after variable ] [ r specifies a variable reference 1 specifies the variable in reference must occur at least this times must occur at most this times current repeat times ] E specifies the very end of the string ]*/ /*vca = [ [ 0 variable number 1 start character position 2 start regexp position 3 minimum repeat times 4 maximum repeat times 5 current repeat times ] ]*/ Object.prototype.RegExp = function(a,b){ //trace(a); // internal functions/char look-up tables var tproto = RegExp.prototype; var repNum = tproto.funcs.repnum; var range = tproto.funcs.range; var isN = tproto.funcs.isN; var mix = tproto.funcs.mix; var ec = tproto.tables.ec; var eca = tproto.tables.eca; var re = []; var ta = []; var vc = 1; // variable count var va = []; // variable array var vpa = []; // variable position array var ap = 0; // array position of expression var cv = []; // current variable var sl = a.length; // passed string length var bo, bc; // bracket open; bracket closed var i, k, j, r, fromn, from, ton, to, ca, la, tca, tsa, van, error, oca, tma; for(i=0;i<=sl;i++){ ta = []; ca = substring(a, i+1, 1); if (bc == true || ca == ")"){ if(!(bo > 0)) { error = "Syntax error, char "+ (i+1); break; } va[cv[cv.length-1][0]].push(ap); re[ap++] = [-(cv[cv.length-1][0]+1)]; re[vpa[re[ap-1][0]*-1-1]][4] = ap; bo--; bc = false; if(ca == ")" && substring(a, i, 1) != ")") ca = substring(a, ++i+1, 1); van = va[cv[cv.length-1][0]][0]; // variable array number if(ca == "{" || ca == "?" || ca == "*" || ca == "+"){ la = repNum(substring(a, i+1)); if(typeof(la) != "object") { error = la + ", char " + (i+1); break; } re[van][2] = la.a[0]; re[van][3] = la.a[1]; i += la.i+1; ca = substring(a, i+1, 1); } else { re[van][2] = re[van][3] = 1; } cv.pop(); } if(ca == "("){ cv[cv.length] = [vc-1, ap]; va[vc-1] = [ap]; vpa[vc-1] = ap; re[ap++] = ["v",vc++]; bo++; ca = substring(a, ++i +1, 1); } if(ca == "|"){ if(re[ap-1][0] < 0){ re[vpa[re[ap-1][0]*-1-1]][5] = true; re[ap-1][1] = true; } else { re[ap++] = "OR"; } ca = substring(a, ++i +1, 1); } // get the matching text if (ca == "["){ r = range(substring(a, i+1)); if(typeof(r) != "object"){ error = r + ", char " + (i+1); break; } ta[2] = r.a[0]; ta[3] = r.a[1]; i += r.i; } else if (ca == "\\"){ if(isN(tca = substring(a, i+2, 1)) ){ i = i+2; ca = substring(a, i+1, 1); if(ca == "{" || ca == "?" || ca == "*" || ca == "+"){ la = repNum(substring(a, i+1)); if(typeof(la) != "object") { error = la + ", char " + (i+1); break; } re[re.length] = ["r",Number(tca),la.a[0],la.a[1]]; i += la.i; ca = substring(a, i+1, 1); } else { re[re.length] = ["r",Number(tca),1,1]; i--; } ap++; } else { i++; ca = substring(a, i+1, 1); oca = ord(ca); if(ec[oca]){ //trace(eca+"\n\n"+eca[oca]+"\n-------"); if(eca[oca]){ mtf = (eca[oca][0] == 1) ? 2 : 3; ta[mtf] = mix(ta[mtf], eca[oca][1]); } else { tma = []; tma[ord(ca)] = true; ta[2] = mix(ta[2],tma); } } else { error = "Unescaped \\ character, char " + (i+1); break; } i++; } } else if (ca == "."){ ta[3] = eca[ord("n")]; i++; } else if (ca == "^" || ca == "$"){ if((ca == "^" && i == 0) || (ca == "$" && i == sl-1)){ i++; ta = (ca == "^" ? "B" : "E"); } else { error = "Syntax error, char " + (i+1); } } else if (ca == "?" || ca == "*" || ca == "+"){ error = "Unexpected quantifier, char " + (i+1); } else if (ca == "{"){ la = repNum(substring(a, i+1)); if(typeof(la) != "object" && la != "Invalid range") { tma = []; tma[ord(ca)] = true; ta[2] = tma; i++; } else { error = "Unexpected quantifier, char " + (i+1); } } else if (ca.length > 0 && ca != "(" && ca != ")"){ tma = []; tma[ord(ca)] = true; ta[2] = tma; i++; } if(error != null) break; // set the loop amount ca = substring(a, i+1, 1); if(ca == ")"){ if(bo == 0 || bo == null){ error = "Syntax error, char " + (i+1); break; } bc = true; } if(ta.length > 0){ if(ca == "{" || ca == "?" || ca == "*" || ca == "+"){ la = repNum(substring(a, i+1)); if(typeof(la) != "object") { error = la + ", char " + (i+1); break; } ta[0] = la.a[0]; ta[1] = la.a[1]; i += la.i; } else { ta[0] = ta[1] = 1; i--; } re[ap++] = ta; } else if (ca == "("){ i--; } } if(bo > 0) error = "Unclosed parenthesis"; b = b.toLowerCase(); var ignoreCase = false; var global = false; if(b != "" && b != null){ if(b.indexOf("i") >= 0) ignoreCase = true; if(b.indexOf("g") >= 0) global = true; } if(error != null) { this.valid = false; this.re = error; } else { this.valid = true; this.re = re; this.ignoreCase = ignoreCase; this.global = global; this.lastIndex = 0; this.source = a; } } RegExp.prototype.funcs = new Object(); // find the number of times the expression loops // {2,4} returns {a:[2,4],i:5} RegExp.prototype.funcs.repNum = function(a){ var i = 0,min,max,c,error,lngth,ca,ta = []; c = false; lngth = a.length; ca = substring(a, 1, 1); if(ca == "*") { ta[0] = 0; } else if (ca == "+") { ta[0] = 1; } else if (ca == "?") { ta[0] = 0; ta[1] = 1; } else if (ca == "{") { while(i++= 48 && b <= 57) || (b >= 65 && b <= 90) || (b >= 97 && b <= 122)) return true; return false; } RegExp.prototype.funcs.isN = function(a){ var b = ord(a); if(b >= 48 && b <= 57) return true; return false; } RegExp.prototype.funcs.mix = function(a1, a2){ if (a1 == undefined) return a2; if (a2 == undefined) return a1; for(var i in a2) a1[i] = a2[i]; return a1; } RegExp.prototype.funcs.addRL = function(re,txt,max,cur,reLoop,lastRL,wre,vars){ //trace("addRL() | re:"+re+":txt:"+txt+":max:"+max+":cur:"+cur); var lngth = reLoop.length; for(var i=0; i= max && max > 0 && max != "OR" && max != "zero" && max != "var"){ reLoop.splice(i,1); } else if (cur < max || max == null || max == "OR" || max == "var"){ reLoop[i] = [re, txt, max, cur, wre, vars]; } break; } else if(reLoop[i][0] == re && max == "var"){ var found = true; break; } } if(!found && (cur < max || max == null || max == "OR" || max == "zero" || max == "var")){ reLoop.unShift([re, txt, max, cur, wre, vars]); } return {reLoop:reLoop, lastRL:lastRL}; } RegExp.prototype.funcs.getRL = function(reLoop,lastRL){ //trace("lastRL[]: "+lastRL+" :reLoop[0]: "+reLoop[0]); while(reLoop.length > 0){ if((reLoop[0][0] == lastRL[0] && reLoop[0][1] == lastRL[1]) || reLoop[0][2] == "var"){ reLoop.shift(); } else { break; } } lastRL = [reLoop[0][0], reLoop[0][1]]; if(!(reLoop.length > 0)) return {valid:false, reLoop:reLoop, lastRL:lastRL}; var t = reLoop[0]; if(reLoop[0][2] == "OR" || reLoop[0][2] == "zero") reLoop.shift(); //trace("getRL(): "+reLoop); //trace("getRL(): "+t[0]); return {re:t[0], txt:t[1], valid:true, reLoop:reLoop, lastRL:lastRL, wre:t[4], vars:t[5]}; } RegExp.prototype.funcs.compare = function(re2, txt){ var l = 0, i, ca, error = false, min; var re = re2.concat(); if(re[4] >= re[0] && re[0] != re[1]) re[0] = 1; if(txt.length > 0){ if(re[0] == re[1]){ min = re[0]; } else if(re[4] < re[0] && re[0] > 0){ min = re[0]; } else { min = 1; } for(i=0; i< min; i++){ if(i+1 > txt.length){ error = true; break; } ca = substring(txt, i+1, 1); if(!(re[2].length > 0) || !re[2][ord(ca)]){ if(!(re[3].length > 0) || !re[3][ord(ca)]){ error = true; break; } else { l++ }; } else { l++ }; } } else { error = true; } if(error){ l = 0; } //trace("compare() | re:"+re+":txt:"+txt+":valid:"+!error); return {valid: !error, l:l, rt: re[0]}; } RegExp.prototype.tables = {}; RegExp.$o = []; RegExp.$o[36] = RegExp.$o[40]=RegExp.$o[41]=RegExp.$o[42]=RegExp.$o[43]=RegExp.$o[46]= RegExp.$o[49]=RegExp.$o[50]=RegExp.$o[51]=RegExp.$o[52]=RegExp.$o[53]=RegExp.$o[54]= RegExp.$o[55]=RegExp.$o[56]=RegExp.$o[57]=RegExp.$o[63]=RegExp.$o[66]=RegExp.$o[68]= RegExp.$o[83]=RegExp.$o[87]=RegExp.$o[91]=RegExp.$o[92]=RegExp.$o[93]=RegExp.$o[94]= RegExp.$o[98]=RegExp.$o[100]=RegExp.$o[102]=RegExp.$o[110]=RegExp.$o[114]=RegExp.$o[115]= RegExp.$o[116]=RegExp.$o[119]=true; RegExp.prototype.tables["ec"] = RegExp.$o.concat(); RegExp.prototype.tables["eca"] = []; RegExp.$o = []; RegExp.$o[32] = true; RegExp.prototype.tables["eca"][98] = [1, RegExp.$o.concat()]; // \b RegExp.prototype.tables["eca"][66] = [0, RegExp.$o.concat()]; // \B RegExp.$o = []; RegExp.$o[48] = RegExp.$o[49]=RegExp.$o[50]=RegExp.$o[51]=RegExp.$o[52]=RegExp.$o[53]= RegExp.$o[54]=RegExp.$o[55]=RegExp.$o[56]=RegExp.$o[57]=true; RegExp.prototype.tables["eca"][100] = [1, RegExp.$o.concat()]; // \d RegExp.prototype.tables["eca"][68] = [0, RegExp.$o.concat()]; // \D RegExp.$o = []; RegExp.$o[9] = true; RegExp.prototype.tables["eca"][116] = [1, RegExp.$o.concat()]; // \t RegExp.$o = []; RegExp.$o[10] = true; RegExp.prototype.tables["eca"][110] = [1, RegExp.$o.concat()]; // \n RegExp.$o = []; RegExp.$o[12] = true; RegExp.prototype.tables["eca"][102] = [1, RegExp.$o.concat()]; // \f RegExp.$o = []; RegExp.$o[13] = true; RegExp.prototype.tables["eca"][114] = [1, RegExp.$o.concat()]; // \r RegExp.$o = []; RegExp.$o[9] = RegExp.$o[10]=RegExp.$o[12]=RegExp.$o[13]=true; RegExp.prototype.tables["eca"][115] = [1, RegExp.$o.concat()]; // \s RegExp.prototype.tables["eca"][83] = [0, RegExp.$o.concat()]; // \S RegExp.$o = []; RegExp.$o[48] = RegExp.$o[49]=RegExp.$o[50]=RegExp.$o[51]=RegExp.$o[52]=RegExp.$o[53]= RegExp.$o[54]=RegExp.$o[55]=RegExp.$o[56]=RegExp.$o[57]=RegExp.$o[65]=RegExp.$o[66]= RegExp.$o[67]=RegExp.$o[68]=RegExp.$o[69]=RegExp.$o[70]=RegExp.$o[71]=RegExp.$o[72]= RegExp.$o[73]=RegExp.$o[74]=RegExp.$o[75]=RegExp.$o[76]=RegExp.$o[77]=RegExp.$o[78]= RegExp.$o[79]=RegExp.$o[80]=RegExp.$o[81]=RegExp.$o[82]=RegExp.$o[83]=RegExp.$o[84]= RegExp.$o[85]=RegExp.$o[86]=RegExp.$o[87]=RegExp.$o[88]=RegExp.$o[89]=RegExp.$o[90]= RegExp.$o[95]=RegExp.$o[97]=RegExp.$o[98]=RegExp.$o[99]=RegExp.$o[100]=RegExp.$o[101]= RegExp.$o[102]=RegExp.$o[103]=RegExp.$o[104]=RegExp.$o[105]=RegExp.$o[106]=RegExp.$o[107]= RegExp.$o[108]=RegExp.$o[109]=RegExp.$o[110]=RegExp.$o[111]=RegExp.$o[112]=RegExp.$o[113]= RegExp.$o[114]=RegExp.$o[115]=RegExp.$o[116]=RegExp.$o[117]=RegExp.$o[118]=RegExp.$o[119]= RegExp.$o[120]=RegExp.$o[121]=RegExp.$o[122]=true; RegExp.prototype.tables["eca"][119] = [1, RegExp.$o.concat()]; // \w RegExp.prototype.tables["eca"][87] = [0, RegExp.$o.concat()]; // \W delete RegExp.$o; RegExp.prototype.vars = {lastRL:null, reLoop:null}; /*reLoop = [ [ RE position text position max repeat cur repeat ] ] variable stack [ [ //position in stack = varnum-1 0 matched text 1 text position 2 RE position 3 min repeat 4 max repeat 5 cur repeat ] ]*/ RegExp.prototype.exec = function(txt){ // internally referenced functions var tproto = RegExp.prototype; var compare = tproto.funcs.compare; var addRL = tproto.funcs.addRL; var getRL = tproto.funcs.getRL; var re = this.re; var i,j,k,varnum,vars,match,tempRL,sc,ssc,error,lastB,min,reLoop,lastRL,bTrack,lngth; var rel = re.length; var txl = txt.length; if(!(txl > 0)) txl = 1; // if ignoreCase is true, set all matched text/expressions to lowercase var txt2 = txt + ""; if(this.ignoreCase){ for(i=0;i= 0 && typeof re[i] == "object"){ for(j=65; j<91; j++) if(re[i][2][j]) re[i][2][j+32] = true; for(j=65; j<91; j++) if(re[i][3][j]) re[i][3][j+32] = true; } } txt = txt.toLowerCase(); } // reset all variables within the given RegExp i = 0; while(this["$"+i] != null){ this["$"+i++] = null; } this.lastMatch = this.leftContext = this.rightContext = this.lastParen = null; var beg = (re[0] == "B" ? true : false); var end = (re[re.length-1] == "E" ? true : false); for(i=(this.global ? this.lastIndex : 0); i 0) break; sc = i; // start character vars = []; reLoop = []; lastRL = []; error = varnum = match = tempRL = lastB = min = null; for(j=0; j 0){ min = re[j][2]; } else { min = 1; } for(k=0; k= 0 && typeof re[j] == "object") { // text match // if minimum = 0 add to RL[] if (re[j][0] == 0 && (re[j][6] > i || re[j][6] == null)) { addRL(j+1, i, "zero", null, reLoop, lastRL, re, vars); re[j][6] = i; } // call the text/RE compare function match = compare(re[j], substring(txt, i+1)); if (!match.valid) { error = true; } else { // increment the cur textPos by the returned match length i += match.l; // increment the cur repeat times re[j][4] += match.rt; // add the RE reference to the reLoop[] incase further looping is possible addRL(j, i, re[j][1], re[j][4], reLoop, lastRL, re, vars); } } // if(i>=txt.length && j+1=rel && end) error = true; if(i=rel && !end && !error) { if(bTrack != null && i >= bTrack[0]){ bTrack = [i,j,vars]; } else if (bTrack == null){ bTrack = [i,j,vars]; } error = true; } //if(error) trace(i+":txt:"+txt.length+" : "+(j+1)+":re:"+re.length+" : "+re[j]); if (error){ if (re[j+1] == "OR"){ error = null; } else if (reLoop.length > 0) { tempRL = getRL(reLoop,lastRL); reLoop = tempRL.reLoop; lastRL = tempRL.lastRL; if(!tempRL.valid && bTrack == null) { break; } else if(!tempRL.valid){ i = bTrack[0]; j = bTrack[1]; vars = bTrack[2]; error = null; break; } //if(tempRL.re < lastB) vars.splice(lastB-2); j = tempRL.re-1; i = tempRL.txt; re = tempRL.wre; vars = tempRL.vars; } else if (bTrack != null){ i = bTrack[0]; j = bTrack[1]; vars = bTrack[2]; error = null; break; } else { break; } error = null; } else if (re[j+1] == "OR" || (re[j][0] < 0 && re[j][1] == true)){ if (re[j+1] == "OR") { j+=1; addRL(j+1, ssc, "OR", null, reLoop, lastRL, re, vars); } // loop until non-OR is found, set RE = this-1 for(;j++= rel-1){ this.lastIndex = i; this.leftContext = substring(txt2, 1, sc); var match = substring(txt2, sc+1, i-sc); this.rightContext = substring(txt2, i+1); var tempvars = []; var ret = {index:sc, input:txt2, valid: true, length:i-sc}; ret[0] = match; j = 0; lngth = vars.length; for(i=0;i 0) { j++; ret[j] = vars[i][0]; RegExp.lastParen = vars[i][0]; } } i=10; while(--i){ RegExp["$"+i] = ret[i]; } // ret = ret.concat(vars); return ret; } } this.lastIndex = 0; return {valid:false} } String.prototype.replace = function(re,str){ var i,ca,tn,lngth,temp,ts,tfs,tra,mark,ra; ra = [str]; lngth = str.length; for(i=0;i 0) tra[i] = temp[tra[i]]; ts = tra[i] + ts; } tfs = substring(tfs, 1,temp.index) + ts + substring(tfs, temp.index+temp.length+1); re.lastIndex += ts.length; if(!re.global) break; } trace(temp.valid); return tfs; } ASSetPropFlags(Object.prototype,["RegExp"],1);