Avatar billede monkeysee Nybegynder
21. marts 2003 - 07:49 Der 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:
--------------------------------------------------------

<html>
<head>
<title>displayComments</title>
</head>

<body bgcolor="#FF00FF">

<table border="1" cellpadding="0" cellspacing="0" width="100%" bordercolor="#00FFFF">
  <tr>
    <td width="10%"><!-- n2bot scope="text" id="207" -->&nbsp;</td>
    <td width="10%"><!-- n2bot scope="media" id="207" -->&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
  </tr>
</table>

</body>

</html>
Avatar billede monkeysee Nybegynder
23. marts 2003 - 19:23 #1
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å...)
Avatar billede monkeysee Nybegynder
23. marts 2003 - 20:53 #2
He-he...det går fremad!!

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" );
---------------------------------------------------
Avatar billede monkeysee Nybegynder
23. marts 2003 - 21:56 #3
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]

        //    define realtime commands
        n2cmd=""
        if(this.scope[i]=='"text"')n2cmd='<span style="font-size:14pt">edit text</span>'
        if(this.scope[i]=='"media"')n2cmd='<span style="font-size:14pt">edit media</span>'

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

%>
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester