Toon posts:

[js] RegEx: Target LowerCase maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik zit al even te zoeken naar een manier om de regex target om te zetten naar lowercase zoals dit:
code:
1
2
3
//Maak alle tags lowercase.
var regEx = /(<[A-Z0-9=\'\"\s\;]+>)/gi;
var out = code.replace(regEx, "$1.toLowerCase()");

Dat .toLowerCase() gaat hier natuurlijk niet werken maar dat even ter illustratie. Ik zoek een manier waarop het wel kan.

Het moet zoeken naar alle tags en deze omzetten naar lowercase. Google heeft wel geholpen alleen niet voor dit specifieke probleem en GoT search is al tijdje stuk..

  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

var out = (regEx, "$1").toLowerCase();

Of moet je ook een loop hebben die de hele pagina langsgaat?

Verwijderd

Je kunt denk ik het beste de .match(RegExp) methode gebruiken. Deze returned een Array met alle matches. Daar kun je dan weer een voor een doorheen loopen en een replace in de originele string op los laten.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
var s = "<A><B>CMAMAMA</B></A>";
var regEx = /(<[A-Z0-9=\'\"\s\;\/]+>)/gi;

var aMatch = s.match(regEx);
for(var i=0; i<aMatch.length; i++) {
    var sOrig = aMatch[i];
    var sNew = sOrig.toLowerCase();

    s = s.replace(sOrig, sNew);
}
alert(s);

Overigens mis je nog een backslash in je RegExp. Ik neem aan dat je de sluitende tags ook wilt converten.

edit:
Overigens worden met deze regexp ook alle attribute/value paren geLowerCased. Dat kan nooit de bedoeling zijn.
André schreef op 30 juli 2004 @ 12:00:
var out = (regEx, "$1").toLowerCase();
Hiermee worden alle textnodes tussen de tags volgens mij ook gewoon lowercase.

[ Voor 27% gewijzigd door Verwijderd op 30-07-2004 12:08 ]


Verwijderd

Topicstarter
@André:

Ohh! |:( |:(
Dit had ik natuurlijk zelf ook kunnen uitdokteren.. :) Op deze momenten ga ik minder koffie drinken!

@Blues:

Ik had 'm al :) Toch bedankt.
Voor sluitende tags had ik de regex al.

[ Voor 30% gewijzigd door Verwijderd op 30-07-2004 12:05 ]


Verwijderd

Als je in vervolg wat geavanceerdere dingen wil doen met de matches:

code:
1
2
3
4
5
//Maak alle tags lowercase.
var regEx = /(<[A-Z0-9=\'\"\s\;]+>)/gi;
var out = code.replace(regEx, function ($1) {
  return $1.toLowerCase();
});


/me voorziet problemen met die regex.

Denk aan: <b onclick="alert(4>5);">

Deze werkt wel: ;)
code:
1
2
3
4
5
var re = new RegExp("<(\/?)([a-zA-Z0-9]+?)(\s*)(([a-zA-Z0-9]+?)(\s*)=(\s*)((\'|\")([^\9]*)\9\s*)|(([^\s>*])\s*))*?>", "gi");
var code = "<b    onclick   =  'alert(4>5);' class = 'fi>le'    >asdf</b>";
var out = code.replace(regEx, function ($1) {
  return $1.toLowerCase();
});

[ Voor 27% gewijzigd door Verwijderd op 30-07-2004 12:16 ]


Verwijderd

Verwijderd schreef op 30 juli 2004 @ 12:03:
Ohh! |:( |:(
Dit had ik natuurlijk zelf ook kunnen uitdokteren.. :) Op deze momenten ga ik minder koffie drinken!
Zoals ik al zei, volgens mij werkt de methode van André niet. Anders kun je net zogoed code.toLowerCase() doen. :?

@Jorgen: Cute, die kende ik nog niet. Moet ik zeker onthouden.

[ Voor 9% gewijzigd door Verwijderd op 30-07-2004 12:16 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 30 juli 2004 @ 12:14:
* crisp voorziet problemen met die regex.

Denk aan: <b onclick="alert(4>5);">

Dat is ook geen net HTML, dat groter-dan teken zou een entity moeten zijn.

[ Voor 4% gewijzigd door crisp op 30-07-2004 12:58 ]

Intentionally left blank


Verwijderd

crisp schreef op 30 juli 2004 @ 12:58:

[...]

Dat is ook geen net HTML, dat groter-dan teken zou een entity moeten zijn.
Ik weet dat, jij weet het, maar elke browser rendert het correct. Je zegt het precies in de goede tijd 'zou moeten zijn'. De praktijk leert echter dat maar weinig programmeurs zo netjes te werk gaan.
Het valt simpelweg niet uit te sluiten dat mensen toch dat formaat nemen. Dan kan je maar beter een regex nemen die dat ook meeneemt. Okey, zo blijft de incorrectheid in stand, maar 't werkt in ieder geval wel...
Verwijderd schreef op 30 juli 2004 @ 12:15:
[...]

@Jorgen: Cute, die kende ik nog niet. Moet ik zeker onthouden.
Die heb ik ook zelf in elkaar getimmerd. Het is mij alleen onduidelijk waarom sommige groepen uit die regex wel gematched worden en anderen niet. Ik had namelijk het idee om het eerste deel te vervangen voor alle HTML tags, zodat ook echt alleen HTML tags gematched zouden worden. Dan wou ik het voor mekaar krijgen dat alle attributen naar lowercase werden gezet. Ik krijg dat alleen met geen mogelijkheid voor elkaar in één regex...
Als je een exec() er overheen gooit, dan matched hij niet alle groepen 8)7

[ Voor 37% gewijzigd door Verwijderd op 30-07-2004 13:29 ]


Verwijderd

Verwijderd schreef op 30 juli 2004 @ 13:27:
Die heb ik ook zelf in elkaar getimmerd.
Ik bedoelde de function call in .replace(), niet de regular expression. :)
Het is mij alleen onduidelijk waarom sommige groepen uit die regex wel gematched worden en anderen niet. Ik had namelijk het idee om het eerste deel te vervangen voor alle HTML tags, zodat ook echt alleen HTML tags gematched zouden worden. Dan wou ik het voor mekaar krijgen dat alle attributen naar lowercase werden gezet. Ik krijg dat alleen met geen mogelijkheid voor elkaar in één regex...
Als je een exec() er overheen gooit, dan matched hij niet alle groepen 8)7
Kun je daar eens wat code van posten? Ik begrijp niet helemaal wat je bedoelt.

Verwijderd

Men neme de volgende code:

code:
1
2
3
4
5
var re = new RegExp("<(\/?)([a-zA-Z0-9]+?)(\s*)(([a-zA-Z0-9]+?)(\s*)=(\s*)((\'|\")([^\9]*)\9\s*)|(([^\s>*])\s*))*?>", "gi");
var code = "<b    ONCLICK   =  'alert(4>5);' CLASS = 'fi>le'    >asdf</b>";
var out = code.replace(regEx, function ($1) {
  return ""; // Dit betekent dat alle tags verwijderd worden
});


Aan jou de eer: schrijf de replace code zó, dat alle attribuutnamen omgezet worden naar kleine letters. Dat is onmogelijk om te doen...

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

blaat

[ Voor 97% gewijzigd door Guillome op 30-07-2004 20:03 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

sommige dingen wil je ook niet in 1 regexp stoppen; de boel gewoon functioneel uitsplitsen is èn sneller èn overzichtelijker.
Ik zou dus eerst matchen op tags, en dan daarbinnen matchen op attributen.

[ Voor 32% gewijzigd door crisp op 31-07-2004 00:01 ]

Intentionally left blank

Pagina: 1