Toon posts:

[JS] Regex: attributes matchen in onbepaalde volgorde

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb me suf gezocht op Google en GoT, maar ik kan nergens een oplossing vinden...

Ik heb een XML bestand met elementen erin, daarmee wil ik afhankelijk van het type de elementen matchen. Als het type "url" is wil ik het [b]text[b]- en het script-attribuut matchen en in een variabele stoppen.

Onderstaand is mijn XML string en de regex die ik nu heb (ingekort voor het voorbeeld):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var xmlstr ='<?xml version="1.0" encoding="iso-8859-1"?>'+
'<tree id="0">'+
'   <item im0="folder_close.gif" im1="folder_close.gif" im2="folder_close.gif" type="map"  id="1138862556812"  open="1"  text="Welkom"  ></item>\n'+
'   <item im0="macro_url_icon.gif" im1="macro_url_icon.gif" im2="macro_url_icon.gif" type="url" script="http://www.google.nl" id="1138863292203"  text="Google" closeable="0" ></item>\n'+
'</tree>';

var re = /<item\b(type\s*\=\s*\"url\")[^>]*>/g;
var tags = xmlstr.match(re);
if (tags) {
    var re2 = /\bscript\s*\=\s*\"([^"]*)\"\s+text\s*=\s*\"([^"]*)\"/g;
    var attrs = [];
    for (var i = 0; i < tags.length; i++) {
        // Nog onvolledig...
        attrs[i] = tags[i].match(re2);
    }
    alert( attrs );
}
Ik heb de XML string expres rommelig gelaten, zodat ik mijn regex zo goed mogelijk kan schrijven en niet te snel denk dat ie al volledig is.

Ik wil de matches uiteindelijk als volgt in een array stoppen:
JavaScript:
1
2
3
var links = [];
links['http://www.google.nl'] = 'Google';
// etc etc...
Waar ik vastloop is volgens mij bij het matchen van attributen met een onbepaalde volgorde. Alvast bedankt voor de hulp!

[ Voor 15% gewijzigd door Verwijderd op 09-03-2006 11:22 ]


Verwijderd

Topicstarter
Om elementen met een type="url" te matchen heb ik hem inmiddels gevonden geloof ik:
JavaScript:
1
2
var re = /<item\b[^>]*(type\s*\=\s*\"url\")[^>]*>/g;
var tags = xmlstr.match(re);

Verwijderd

je hebt xml, waarom gebruik je dan geen xml dom tools daarvoor?

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 09 maart 2006 @ 11:28:
je hebt xml, waarom gebruik je dan geen xml dom tools daarvoor?
De XML is een string uit de database, hoe kan ik daar dan doorheen lopen en werkt dit ook met IE?

Had daar al naar gezocht maar ik dacht dat het niet kon...

[ Voor 11% gewijzigd door Verwijderd op 09-03-2006 11:31 ]


Verwijderd


Verwijderd

Topicstarter
Had ik gevonden inderdaad, naast het artikel op Quirksmode.org

Ik loop alleen aan tegen brakke implementatie en ik weet nog niet hoe ik een XML string in kan laden in Firefox.

Aangezien ik die regex al bijna klaar heb lijkt dat me in dit geval een stuk makkelijker...

Verwijderd

Topicstarter
Ik zou wel graag de oplossing willen weten voor het matchen van een onbepaalde volgorde met regex. Kan iemand me hier mee helpen?

Lijkt me best wel handig om te weten, ook voor bij andere gevallen.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:07

crisp

Devver

Pixelated

Verwijderd schreef op donderdag 09 maart 2006 @ 13:52:
Ik zou wel graag de oplossing willen weten voor het matchen van een onbepaalde volgorde met regex. Kan iemand me hier mee helpen?

Lijkt me best wel handig om te weten, ook voor bij andere gevallen.
Je matched gewoon alle items (in dit geval attributen) en stopt dat in een array of andersoortig object, vervolgens kan je gewoon in die array kijken of een bepaald item (attribuut) wel of niet voorkomt.

Intentionally left blank


Verwijderd

voor fx heb je het DOMParser object dat je kan gebruiken: http://xulplanet.com/references/objref/DOMParser.html

IE kan inderdaad met de XMLDom.loadXML() method aan de slag

Verwijderd

Topicstarter
crisp schreef op donderdag 09 maart 2006 @ 14:02:
[...]

Je matched gewoon alle items (in dit geval attributen) en stopt dat in een array of andersoortig object, vervolgens kan je gewoon in die array kijken of een bepaald item (attribuut) wel of niet voorkomt.
Bedoel je dan dat ik voor elk attribuut dat ik wil matchen een .match() moet uitvoeren? Of kan het in één regex?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:07

crisp

Devver

Pixelated

Gewoon een soort basic parser op basis van 2 simpele regexps (1 voor elementen, 1 voor attributen):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var s = '<foo bar="blaat" tok="tak">hohoh</foo><woei ik=\'hip\'>tralala</woei>';

var element_regexp = /<(\w+)([^>]*)>/g;
var attribute_regexp = /(?:\s)(\w+)=("|')(.*?)\2/g;
var element_match, attribute_match;

while ((element_match = element_regexp.exec(s)))
{
    alert('element: ' + element_match[1]);

    attribute_regexp.lastIndex = 0;
    while ((attribute_match = attribute_regexp.exec(element_match[2])))
    {
        alert('attribute: ' + attribute_match[1] + ' - value: ' + attribute_match[3]);
    }
}

Intentionally left blank

Pagina: 1