21. marts 2003 - 07:49Der er
2 kommentarer og 1 løsning
Regexp kørt to gange
Jeg er ved at lave et script hvor det er meningen at man skal kunne "se" indholdet af HTML kommentarer. Der findes både "tekst" og "billed" kommentarer, så jeg vil gerne kunne vise dem på forskellige måder!
Jeg har en expression som finder alle kommentarer der starter med "<!-- n2bot" og slutter med "-->" (altså ganske almindelige HTML kommentarer).
Når jeg så tjekker indholdet af hvert resulterende match og vil lave opdatere dokumentet derefter med replace(), får jeg brug for endnu en expression, krævet af replace() som argument.
Så jeg skal på en eller anden måde fortælle min nye expression at den skal bruge teksten fra match nummer $3 fra den forrige expression ??
Jeg har prøvet at bruge resulatet i en bogstavelig form (^), men det er ikke lykkedes at få det til at fungere...
--------------------------------------------------------- Her er hele scriptet, min kode er Jscript: ---------------------------------------------------------
function displayComments(textString) {
// the comment text or media ?? this.scope = new Array()
// this expression extracts comments between "<!-- n2bot" and "-->" // var re = /([str_beginning])(\s*)(.+)(\s*)([str_end])/i var re = /(\<!\-\-\sn2bot)(\s*)(.+)(\s*)(\-\-\>)/gi
var out = "", last = 0, arr, i = 0; //loop through the instances and save them while ((arr = re.exec(textString)) != null) {
// 2nd regular expression: match against each result of first match ?? var re2 = /^$3/gi
// retrieve the values... // split into "value pairs", e.g.; // scope="text" id="207" author="1" version="2002103070202" var str2=(RegExp.$3).split(" ")
// loop through value pairs... for(j=0;j<str2.length;j++){ // split values... var str=str2[j].split("=") // check values... for(k=0;k<str.length;k++){ switch(str[k]){ case "scope" : this.scope[i]=str[k+1]; break; } switch(this.scope[i]){ case "\"text\"" : out = textString.replace(re2, "<p>Scope:text</p><!-- n2bot $3-->"); break; case "\"media\"" : out = textString.replace(re2, "<p>Scope:media</p><!-- n2bot $3-->");break; } } } i++ } Response.Write(out) }
-------------------------------------------------------- Her er en HTML side med kommentarer: --------------------------------------------------------
OK, måske for stor en mundfuld med den komplette sourcekode...heg har i mellemtiden reduceret mit problem til flg ;-)
Hvis vi forestiller os at jeg har flg. reg-ex som udtrækker kommetarer der starter med "<!-- n2bot" og slutter med "-->": -------------------------------------------- /(\<!\-\-\sn2bot\s)(\s*)(.+)(\s*)(\-\-\>)/gi --------------------------------------------
så skulle man mene at det korrekte syntax med constructor skulle være: ----------------------------------------------------------- new RegExp('(\<!\-\-\sn2bot\s)(\s*)(.+)(\s*)(\-\-\>)','gi') ----------------------------------------------------------- Men den returnerer ingen værdi?? (Se HTML sourcen for at se det materiale jeg tester på...)
Jeg har fundet ud af at syntax ER forskelligt. Den flg. regex virker efter hensigten. Nu er spørgsmålet om der er noget der ligger inde med viden om "constructor vs. literal" for der er jo åbenlyse forskelle... --------------------------------------------------- new RegExp("(<!-- n2bot)(.+)(-->)","gi"), "test" ); ---------------------------------------------------
OK, fik det til at virke!!...her er den endelige sourcekode:
<% /**********************************************/ /* "Parsing With Regular Expressions" */ /**********************************************/
function Inflate() {
var s = this;
// extract ALL comments, looking for this pattern... // [<!-- n2bot][\s][scope][\s][id][\s][author][\s][version][\s][-->] // // remember the following matches: // // $1 - scope // $2 - id
var re = /\<!\-\-\sn2bot\s\s*(scope.+)\s+(id.+)\s*\-\-\>/gi
// save in these arrays... this.scope = new Array() this.id = new Array()
var i=0,out="",arr,val,reStr
//loop through the instances... while ((arr = re.exec(s)) != null) {
// assign scope value val = (RegExp.$1).split("="); if(val[1]=='"text"')this.scope[i]=val[1] if(val[1]=='"media"')this.scope[i]=val[1]
// assign id value val = (RegExp.$2).split("="); this.id[i]=val[1]
// match scope and id to ensure we have the right item: reStr="<!-- n2bot.+scope="+this.scope[i]+" id="+this.id[i]+".+-->"
// start to replace at right character reStr.lastIndex=re.lastIndex;
// do the replace... s=s.replace(new RegExp(reStr,"i"), n2cmd+"<br>scope: "+this.scope[i]+"<br>ID: "+this.id[i]);
// update output/counter out+=s i++ } return out }
%>
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.