[JS] Regexp roept in IE "unexpected quantifier"

Pagina: 1
Acties:

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Howdy!

Ik heb een simpel stukje javascript die zorgt dat elke pagina netjes in het frame komt. Dus bla.asp?id=1&b=2 word index.asp?url=bla.asp!id=1|b=2. Dit werkt prima in Mozilla met deze code:

code:
1
2
3
4
5
6
7
8
9
if ((top != self.parent) || (top == self))
{
    var re = new RegExp ('\?', 'gi') ;
    newurl = newurl.replace(re, '\!') ;
    var re2 = new RegExp ('\&', 'gi') ;
    newurl = newurl.replace(re2, '\|') ;
    top.location.replace('index.asp?newurl=' + newurl);
}
</SCRIPT>


Alleen IE roept nu ineens "invalid quantifier". Dit gaat over de '\?' in de regexps. Wat doettikverkeerd? Op GoT is er weinig over te vinden, en Google geeft te veel resultaten...

edit:

Ik wil dus de ? vervangen door een ! en een & door een |. Dit vervang ik later met ASP weer met de ? en &.

[ Voor 18% gewijzigd door Battle Bunny op 23-07-2003 22:01 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Javascript hoort in W&G bij de specialisten :)

Verwijderd

alert('\?');

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
GlimI: sorry :)
Cheatah: Diep. Maar wat moet ik er mee? Mozilla en IE geven alletwee een messagebox met een vraagteken (zoals ik had verwacht).

Verwijderd

Wat doet een vraagteken in een regular expression? Voor quantifier spelen.
Waar moet een quantifier staan? Na een character, character class of (non-)catching group.
En die staat er niet voor ;)

Wat je wilt is een vraagteken letterlijk in het patroon opnemen, en daarvoor moet je hem escapen. Maar je moet de backslash ook escapen, omdat je anders geen backslash in je patroon krijgt. Dus je moet hem dubbel escapen, want anders zie je geen backslash in het patroon terug, vandaar die alert.

Je kunt ook re = /\?/gi; doen.

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
OMG.... Om het simpel te houden! LOL :-)

Het werkt zo wel, prachtig. Nu vraag ik mij alleen erg af waarom Moz geen fout geeft (zelfs in die Javascript debugger mag ik intikken wat ik voorheen had -- zonder errors)

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Ja, jottum:
This document is obsolete and applies only to Netscape Communicator 4.x
Schiet niet erg op, imho.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Battle_Bunny schreef op 23 July 2003 @ 22:24:
[...]


Ja, jottum:


[...]


Schiet niet erg op, imho.
2 klikken verder: http://devedge.netscape.c...javascript/1.5/reference/ ;)

Intentionally left blank


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

waarom zo ingewikkeld :?
JavaScript:
1
2
3
4
if ((top != self.parent) || (top == self))
{
    top.location.replace('index.asp?newurl=' + escape(newurl) );
}

Overigens werkt onderstaande ook als je door de backslashes het bos niet meer ziet.
JavaScript:
1
var re = new RegExp ('[?]', 'gi') ;

[ Voor 8% gewijzigd door Annie op 24-07-2003 19:34 . Reden: layout ]

Today's subliminal thought is:


  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Waarom? Omdat ik geen bal javascript ken. Simpel. Ik vond uit hoe je text kon replacen, en gebruikte dat.

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Helaas weet ik nu nog steeds niet waarom Mozilla die error niet geeft. Ideeen? Wie van de twee doet het goed?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Battle_Bunny schreef op 25 July 2003 @ 08:20:
Helaas weet ik nu nog steeds niet waarom Mozilla die error niet geeft. Ideeen? Wie van de twee doet het goed?
Blijkbaar maakt Mozilla er niet zo'n punt van als het eerste character een speciaal token is, maar je 'm niet escaped; zelfs dit werkt namelijk in Mozilla:
JavaScript:
1
2
var re = new RegExp('?bla', '');
alert('?blabla'.match(re));

vergelijk het trouwens hiermee:
JavaScript:
1
2
3
4
5
6
7
var string = '\?';
var myCar = new Car(string);
alert(myCar.y.length);

function Car(x) {
  this.y = x;
}

en je snapt waarom je dubbel moet escapen als je de new RegExp constructie gebruikt ipv de // constructor.

Intentionally left blank

Pagina: 1