Avatar billede supermand69 Nybegynder
07. marts 2006 - 21:21 Der er 9 kommentarer og
1 løsning

reg exp

Jeg skal have mulighed for at reducere url's med tilhørende query's, hvor der skal fjernes overflødige _GET vars

Jeg har et array "get_arr" som indeholder de _GET vars som jeg skal beholde - resten skal fjernes

Desuden skal jeg i nogle tilfælde yderligere have føjet en _GET var til.. f.eks. maling=hvid

var get_arr = new Array('kat', 'hund');

function reduce_uri(uri, get_arr)
{
    var reg_exp = new RegExp("^(.+\\?)(.+kat=([a-z0-9_]+))?");
   
    var arr = reg_exp.exec(uri);
   
    alert(arr[1]+' '+arr[3]);
}

reduce_uri('http://www.elb.dk/side.php?hest=lille&hund=1&kat=sort_hvid&futsko=dejlige');
Avatar billede erikjacobsen Ekspert
07. marts 2006 - 22:07 #1
Jeg ville nok ikke bruge regulære udtryk, men noget i retning af nedenstående. Du kan selv tilføje nye parametre i det array "u" der er i funktionen (ja, dumme navne, men så skal man ikke skrive så meget:

var get_arr = new Array('kat', 'hund');

function reduce_uri(uri, get_arr)
{
  var a1;
  a1=uri.split(/\?/);
  if (a1.length==1) {
    new_url=a1[0];
  } else {
    a2=a1[1].split(/&/);
    u=new Array();
    for (i=0;i<a2.length;i++) {
      a3=a2[i].split(/=/);
      u[a3[0]]=a3[1];
    }
    for (i=0;i<get_arr.length;i++) {
      delete(u[get_arr[i]]);
    }
    query='';
    for (e in u) {
      if (query=='') {
        query=escape(e)+"="+escape(u[e]);
      } else {
        query=query+'&'+escape(e)+"="+escape(u[e]);
      }
    }
    new_url=a1[0]+'?'+query;
  }
  return new_url;

}

alert(
reduce_uri('http://www.elb.dk/side.php?hest=lille+sort&hund=1&kat=sort_hvid&futsko=dejlige',get_arr)
);
Avatar billede mclemens Nybegynder
07. marts 2006 - 23:02 #2
Denne virker i både IE og Firefox:

<script language="javascript">

var get_arr = new Array('kat', 'hund');

function reduce_uri(uri){runarr=0;newuri="";
uristart=uri.substring(0,uri.indexOf("?"))+"?";
uriend=uri.substring(uri.indexOf("?")+1);uricheck=uri.substring(uri.indexOf("?")+1);
uriend=uriend.split("&");uricheck=uricheck.split("&");
while(uricheck[runarr]){runarr2=0;dontuse=0;
  uricheck[runarr]=uricheck[runarr].substring(0,uricheck[runarr].indexOf("="));
  while(uricheck[runarr2]){if(uricheck[runarr]==get_arr[runarr2])dontuse=1;runarr2++;}
  if((dontuse==0)&&(newuri!=""))newuri=newuri+"&"+uriend[runarr];
  else if(dontuse==0)newuri=newuri+uriend[runarr];runarr++;
}
newuri=uristart+newuri;
alert(newuri);
}

reduce_uri('http://www.elb.dk/side.php?hest=lille&hund=1&kat=sort_hvid&futsko=dejlige');

</script>
Avatar billede supermand69 Nybegynder
08. marts 2006 - 16:57 #3
erik > den skal ikke slette de variabler som man angiver, men beholde dem :)

derud over skal man også kunne tilføje en helt ny get variabel

eks.

reduce_uri('http://noget.dk?tst=1', get_arr, 'new_var=100')

men den sidste parameter skal man i nogle tilfælde også kunne undlade så det bare ser sådan ud

reduce_uri('http://noget.dk?tst=1', get_arr)
Avatar billede supermand69 Nybegynder
08. marts 2006 - 19:42 #4
har selv siddet og rodet lidt med det, men kan stadig ikke lige komme på en hurtig løsning så man ikke sletter de angivnede get variabler :(

function reduce_uri(uri, get_arr, add_get)
{
    var uri_arr = uri.split(/\?/);
    if(uri_arr.length == 1) new_uri = uri_arr[0];
    else
    {
        query_arr = uri_arr[1].split(/&/);
        var query_arr2 = [];
       
        for(var i=0; i<query_arr.length; i++)
        {
            var_arr = query_arr[i].split(/=/);
            query_arr2[var_arr[0]] = var_arr[1];
        }
       
        for(var i=0; i<get_arr.length; i++)
        {
            delete(query_arr2[get_arr[i]]);
        }
       
        if(add_get)
        {
            var_arr = add_get.split(/=/);
            query_arr2[var_arr[0]] = var_arr[1];
        }
       
        var query_new = '';
       
        for(str in query_arr2)
        {
            if(!query_new) query_new = escape(str)+'='+escape(query_arr2[str]);
            else query_new += '&'+escape(str)+'='+escape(query_arr2[str]);
        }
       
        new_uri = uri_arr[0]+'?'+query_new;
    }
   
    return new_uri;
}

var get_arr = new Array('kat', 'hund');

alert(reduce_uri('http://www.elb.dk/side.php?hest=lille&hund=1&kat=sort_hvid&futsko=dejlige', get_arr, 'tab=59'));
Avatar billede grunken Nybegynder
09. marts 2006 - 02:26 #5
For eksemplets skyld :-)

<script type="text/javascript">
    function slice()
    {
        this.ret = this.gets = [];
   
        //Main functionen
        this.url = function(uri,get_arr,add_arr)
        {
            this.gets = uri.split(/[\?\&]/);
            for(u in get_arr)
            {
                if(chk = this.in_array(get_arr[u],this.gets))
                {
                    this.ret[this.ret.length] = this.gets[chk];
                }
            }
            if(arguments.length==3)
            {
                for(v in add_arr)
                {
                    this.ret[this.ret.length] = add_arr[v];
                }
            }
            return this.joinurl();           
        }
       
        //checker om der eksisterer en given streng i et array
        this.in_array = function(str,arr)
        {
            for(i=0;i<arr.length;i++)
            {
                if(arr[i].indexOf(str+"=")!=-1)
                {
                    return i;
                    break;   
                }
            }
            return false;
        }
       
        //joiner den nye url;
        this.joinurl = function()
        {
            url = this.gets[0];
            for(j=0;j<this.ret.length;j++)
            {
                idt = (j<1) ? "?" : "&";
                url += idt + this.ret[j];
            }
            return url;
        }
    }
   
    slice    = new slice();
    nyurl    = slice.url("http://www.elb.dk/side.php?hest=lille&hund=1&kat=sort_hvid&futsko=dejlige",["hest","hund"],["newVar1=200","newVar2=300"]);
   
    document.write("<a href=\""+nyurl+"\">"+nyurl+"</a>");
</script>
Avatar billede supermand69 Nybegynder
10. marts 2006 - 17:44 #6
jeg vil egentlig gerne bruge det script som erik lavede og jeg har modificeret lidt så jeg selv nemmere kan overskue det :)

men hvordan gør jeg sådan at man _ikke_ sletter de angivne _GET variabler i get_arr, men i stedet er dem som man skal beholde?

function reduce_uri(uri, get_arr, add_get)
{
    var uri_arr = uri.split('?');
    var tmp_query_arr = [];
   
    if(uri_arr.length > 1)
    {
        var query_arr = uri_arr[1].split('&');
       
        for(var i=0; i<query_arr.length; i++)
        {
            var_arr = query_arr[i].split('=');
            tmp_query_arr[var_arr[0]] = var_arr[1];
        }
       
        for(var i=0; i<get_arr.length; i++)
        {
            delete(tmp_query_arr[get_arr[i]]);
        }
    }
   
    if(add_get)
    {
        var_arr = add_get.split('=');
        tmp_query_arr[var_arr[0]] = var_arr[1];
    }
   
    var new_query_arr = [];
   
    for(key in tmp_query_arr)
    {
        new_query_arr[new_query_arr.length] = key+'='+tmp_query_arr[key];
    }
   
    var new_query = new_query_arr.join('&');
   
    var new_uri = uri_arr[0]
    if(new_query) new_uri += '?'+new_query;
   
    return new_uri;
}

alert(reduce_uri('http://www.elb.dk/side.php?kat=11&hehe=sdf', Array('kat'), 'tab=tst'));
Avatar billede erikjacobsen Ekspert
10. marts 2006 - 18:14 #7
Ha' lidt tålmodighed ...
Avatar billede supermand69 Nybegynder
11. marts 2006 - 12:28 #8
erik > jeg har fået det til at virke.. så lav et svar :)

function reduce_uri(uri, get_arr, add_get)
{
    var uri_arr = uri.split('?');
    var tmp_query_arr = [];
   
    if(uri_arr.length > 1)
    {
        var query_arr = uri_arr[1].split('&');
       
        for(var i=0; i<query_arr.length; i++)
        {
            var_arr = query_arr[i].split('=');
            tmp_query_arr[var_arr[0]] = var_arr[1];
        }
       
        var reduce_arr = [];
       
        for(var i=0; i<get_arr.length; i++)
        {
            if(tmp_query_arr[get_arr[i]]) reduce_arr[get_arr[i]] = tmp_query_arr[get_arr[i]];
        }
       
        tmp_query_arr = reduce_arr;
    }
   
    if(add_get)
    {
        var_arr = add_get.split('=');
        tmp_query_arr[var_arr[0]] = var_arr[1];
    }
   
    var new_query_arr = [];
   
    for(key in tmp_query_arr)
    {
        new_query_arr[new_query_arr.length] = key+'='+tmp_query_arr[key];
    }
   
    var new_query = new_query_arr.join('&');
   
    var new_uri = uri_arr[0]
    if(new_query) new_uri += '?'+new_query;
   
    return new_uri;
}

alert(reduce_uri('http://www.elb.dk/side.php?kat=1&hehe=2sd', Array('kat'), 'add=new'));
Avatar billede erikjacobsen Ekspert
11. marts 2006 - 15:37 #9
Jeg har heller ikke haft så meget tid. Måske kommer jeg med noget på lidt færre linier - jeg gemmer i hvert fald lige spørgsmålet. Jeg samler slet ikke på point, tak.
Avatar billede supermand69 Nybegynder
11. marts 2006 - 17:14 #10
ok :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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