[JS] RegExp probleem

Pagina: 1
Acties:

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 24-03 12:54
Goed ik heb een array (het gaat om een javascript rekenmachine, maar dat terzijde):
code:
1
2
3
4
5
6
7
8
var functies = Array(
    Array('sin', 'Math.sin'),
    Array('cos', 'Math.cos'),
    Array('tan', 'Math.tan'),
    Array('log', 'Math.log'),
    Array('10^(', 'Math.pow(10,'),
    Array('w', 'Math.sqrt')
);

sommige wiskundige functies van de input moeten gereplaced worden met de respectievelijke javascript functies :

code:
1
2
3
4
5
for (var i = 0; i < functies.length; i++)
            {
            
            antwoord = antwoord.replace(functies[i][1], functies[i][1]);
            }


Klopt allemaal tot nu toe, alleen als je w(3) x w(3) doet (wortel keer wortel) en andere wiskundige functies, dan replaced hij er maar 1 (van het X aantal dat er in kan staan). Ik dacht dus als oplossing : Regular expressions (nog nooit iets mee gedaan verder ) . dus ik zat een btje te proberen , en dit zou dan moeten werken :

code:
1
2
3
4
for (var i = 0; i < functies.length; i++)
            {
            antwoord = antwoord.replace(new RegExp(functies[i][0], "ig"), functies[i][1]);
            }


Dit stukje code zou dus alle instances van de wiskunde functies moeten replacen, maar dat doet hij niet. Misschien heb ik gewoon de hele basis van deze regular expressions niet begrepen, dan is het misschien een hele domme vraag. Of misschien is m'n syntax fout. Wie kan me helpen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

HTML, CSS, JavaScript, Flash of Director? Kijk eerst hier!

PW>>WG

edit:
Overigens ben je daar al eens eerder op gewezen door [rml]Janoz in "[ css/js] Alle divs aanroepen"[/rml].

[ Voor 38% gewijzigd door NMe op 02-03-2006 00:03 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 24-03 12:54
Sorry, was weer eens te snel |:(

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

javascript hoort in Webdesign & Graphics :)

iig zal je karakters met een speciale betekenis in reguliere expressies moeten escapen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
var antwoord = 'w(3) * w(3)';

function encodeRE(s) { return s.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); }

for (var i = 0; i < functies.length; i++)
{
    antwoord = antwoord.replace(new RegExp(encodeRE(functies[i][0]), 'ig'), functies[i][1]);
}

alert(antwoord);

:)

Intentionally left blank


  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 24-03 12:54
Het werkt perfect. Wat je dus eigenlijk doet is dus deze karakters : "([.*+?^${}()|[\]\/\\])" (/ ervoor en die /g erachter omdat Reg. Exp is. G is alle instances) escapen met "\\$i" . Wat betekent dat laatste dan eigenlijk?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

$1 is een referentie naar hetgeen gematched is in de 1e subpattern

niet echt duidelijk uitgelegd in de javascript reference, maar de PHP PCRE reference is ook erg bruikbaar ;)

[ Voor 81% gewijzigd door crisp op 02-03-2006 00:19 ]

Intentionally left blank

Pagina: 1