Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Javascript] Javascript regex spatie

Pagina: 1
Acties:

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 22-11 20:54
Wederom weer een beetje hulp nodig met een Regex.

Ik probeer te splitten op een spatie maar nu kan het voorkomen dat een string spaties bevat waar deze niet opgesplit moet worden.

JavaScript:
1
2
var str = 'div[class="a b"] ul[class="c d"]';
str.split(/[a-z]+[\[a-z="'\]]+/);


Het wenste resultaat is dat de split dit oplevert:
0: div[class="a b"]
1: ul[class="c d"]

Ik kan dus niet zomaar splitten op een spatie want dan krijg ik vier delen en het komt niet altijd voor dat er twee van deze strings worden geparsed. Soms ook wel 'div ul li a'.

Heeft iemand een idee hoe ik dit kan oplossen? :)

  • yeadder
  • Registratie: Maart 2001
  • Niet online
Met de regex op zich zelf kan ik je niet helpen. Daar voor moet ik zelf ook heel veel het internet raad plegen.

Maar is het gebruik van een komma tussen de twee elementen niet een beter idee? Daar je ook een spatie gebruikt om de verschillende classes op te sommen.

Daarnaast kun je misschien al zelf een eind komen door te spelen op sites zoals: gskinner.com/RegExr/

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Heb je meer informatie over de strings? Wat moet er gebeuren met een string als 'lorem " ipsum'?

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 22-11 20:54
Komma is niet mogelijk want daar wordt deze string ook al eerder op gesplit. Dit zijn een aantal combinaties:

code:
1
2
3
4
div ul a
span[title=test titel]
div[class="a b"]:first-child
h1:last-child


Waarbij elk regel een combinatie van elke regel kan worden met daartussen een spatie.

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Hoe lost jQuery dit op met zijn selectors?

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 01-11 21:54
ZeroXT schreef op dinsdag 28 mei 2013 @ 18:24:
Komma is niet mogelijk want daar wordt deze string ook al eerder op gesplit. Dit zijn een aantal combinaties:

code:
1
2
3
4
div ul a
span[title=test titel]
div[class="a b"]:first-child
h1:last-child


Waarbij elk regel een combinatie van elke regel kan worden met daartussen een spatie.
Je zal dan toch een ander scheidingsteken moeten gebruiken of de mogelijke keuzes moeten voordefinieren. Je gaat geen oplossing voor een regex vinden die een combinatie div ul a met div[class="a b"]:first-child goed gaat opsplitsen in selectors. Als de komma al ergens eerder wordt gebruikt, pak dan een puntkomma of pipe of ...

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:43

crisp

Devver

Pixelated

GlowMouse schreef op dinsdag 28 mei 2013 @ 18:28:
Hoe lost jQuery dit op met zijn selectors?
Gewoon echt parsen gok ik :)

Intentionally left blank


  • pedorus
  • Registratie: Januari 2008
  • Niet online
JQuery heeft een functie tokenize( ...), die trouwens wel intern wat regexpen gebruikt, bijvoorbeeld om meer karakters dan alleen spaties te ondersteunen.

Maar met lookaheads kun je wel iets doen. Je zou zoiets kunnen proberen:
code:
1
 (?![^[]*])

M.a.w: spaties, maar niet gevolgd door een ] zonder dat aan die ] een [ vooraf gaat.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 01-11 21:54
pedorus schreef op dinsdag 28 mei 2013 @ 20:31:
JQuery heeft een functie tokenize( ...), die trouwens wel intern wat regexpen gebruikt, bijvoorbeeld om meer karakters dan alleen spaties te ondersteunen.

Maar met lookaheads kun je wel iets doen. Je zou zoiets kunnen proberen:
code:
1
 (?![^[]*])

M.a.w: spaties, maar niet gevolgd door een ] zonder dat aan die ] een [ vooraf gaat.
Werkt niet, [ ] hoeven helemaal niet eens voor te komen.

Combineer twee selectors:
`div ul a` en `h1:last-child` wordt `div ul a h1:last-child`

En hoe plan je dit te herleiden zonder gebruik van een scheidingsteken?

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Terugherleiden in de DOM / <h1> mag niet in <a> in html4 :+ Nee dat is natuurlijk onmogelijk, maar ik weet niet precies wat het doel is. Uit de TS begreep ik dat "div ul li a" in 4 delen gesplitst moet worden, maar als er geen onderscheid is wordt het een sowieso onmogelijke zaak, dat heeft verder niets met regex te maken...

[ Voor 5% gewijzigd door pedorus op 28-05-2013 22:22 . Reden: html4 erbij ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 22-11 20:54
Ik kon inderdaad dit niet alleen met Regex oplossen. Ik heb besloten om een functie te maken die eerst alle spaties omzet binnen een [ ] en dan gaat splitten op de spatie, om deze vervolgens weer terug te zetten:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function escape(obj, regex, split)
{
    var tmp = obj.match(regex);
                        
    for(var b in tmp)
    {
        obj = obj.replace(tmp[b], encodeURIComponent(tmp[b]))
    }
                            
    var match = obj.split(split);
                            
    for(var b in tmp)
    {
        match[b] = match[b].replace(encodeURIComponent(tmp[b]), tmp[b])
    }
    
    return match;
}


Ik roep de functie vervolgens aan met:

JavaScript:
1
var tags = escape(pieces[a], /\[(.*?)\]/g, /[ ]{1,}/);


Hierbij is pieces[a] de string, de tweede paramater is een regex welk omgezet moet worden en waar spaties in voor kunnen komen, en de derde parameter is ook een regex die split op de spatie.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik snap niet hoe die code het fundamentele onoplosbare probleem wat C0rnelis schetst zou oplossen. Maar sowieso zou ik eens goed naar die code kijken. Als testcase, vergelijk de output van de volgende 2 regels eens:
JavaScript:
1
2
alert(escape('div ul[class="c d"]',/\[(.*?)\]/g, /[ ]{1,}/));
alert('div ul[class="c d"]'.split(/ +(?![^[]*])/))

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 22-11 20:54
Ik heb er even een kleine testcase van gemaakt:

http://jsfiddle.net/a8ML2/4/

De string word niet meer gesplit op de spatie binnen de [ ] karakters.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Probeer je nou een CSS-selectorengine te maken ofzo? CSS-selectors kun je niet parsen met regexen, daar zijn ze te complex voor. Bovendien worden ze van rechts naar links geparsed (bron nodig? volgens mij het is common knowledge, maar roept u maar).

Gaat het puur om de selectors parsen? Gebruik dan Sizzle.
Wil je er nog dingen mee gaan doen? Gebruik dan jQuery (waar Sizzle in zit).
Hoef je IE7 en IE8 niet te ondersteunen? Gebruik dan querySelectorAll().

日本!🎌

Pagina: 1