[JS/RegExp] commentaar verwijderen

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ben nu al enkele uren aan het proberen om een stukje commentaar te verwijderen, maar het lukt me maar niet. De test case waarmee ik het aan het proberen ben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<head>
<script>

function test()
{
    p = document.getElementById('test');
    alert(p.innerHTML);
    p.innerHTML = p.innerHTML.replace(/<!--.*-->/m, "");
    alert(p.innerHTML);
}

</script>
</head>
<body onload="test();">
<p id="test">
<!--

test

-->
</p>
</body>
</html>

Waarom het niet werkt is me een raadsel. Iemand enig idee hoe dit wel te doen is, en waarom dit niet werkt? Normaal ben ik wel redelijk vlot in het bedenken van een goede pattern, maar in JS wil het nu even niet lukken.

Noushka's Magnificent Dream | Unity


Verwijderd

Waar je die m flag vandaan haalt weet ik niet, maar verder snap ik best dat het "niet wil werken". Je kunt namelijk nergens aan zien of het werkt of niet, tenzij je even alert(document.getElementById('test')) doet. De source zal er niet van veranderen, het document in het geheugen wellicht wel.

Verder is het niet wijs om DOM en innerHTML te gebruiken. Met alleen DOM kom je er ook, je kunt alle nodes langslopen en alle comment nodes verwijderen.

  • André
  • Registratie: Maart 2002
  • Laatst online: 06-05 11:13

André

Analytics dude

Is die m flag niet om aan te geven dat het om meerdere regels gaat?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
uitroepteken escapen?
en mssn
code:
1
.[^-->]*


edit: ok ik moet me dus duidelijk niet met regexps bemoeien :P

[ Voor 62% gewijzigd door r0bert op 12-05-2005 09:57 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

de m-modifier heeft alleen nut bij het gebruik van ^ (start of subject) of $ (end of subject) opties
een greedy match zou ik overigens ook niet aanraden bij dit soort dingen

ik denk dat je verder komt met de g-modifier (global match), anders houdt de regexp er sowieso na de eerste match mee op (en in dit geval ws al na de eerste line).

[ Voor 61% gewijzigd door crisp op 12-05-2005 00:31 ]

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

r0bert schreef op donderdag 12 mei 2005 @ 00:18:
uitroepteken escapen?
en mssn
code:
1
.[^-->]*
Je weet wat een characterclass is? en dat wat je hier voorstelt dus nergens op slaat? ;)

Intentionally left blank


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Verwijderd schreef op donderdag 12 mei 2005 @ 00:07:
Waar je die m flag vandaan haalt weet ik niet, maar verder snap ik best dat het "niet wil werken". Je kunt namelijk nergens aan zien of het werkt of niet, tenzij je even alert(document.getElementById('test')) doet. De source zal er niet van veranderen, het document in het geheugen wellicht wel.
m is voor multiline, ik heb hem voor de zekerheid erbij geplaatst. Ik had al gelezen dat het niet direct bruikbaar is zo, maar mischien dat het verschil zou maken. Als je mijn scriptje leest, zie je dat ik eerst het p element ophaal. Daarna wijs aan de innerHTML eigenschap van dat element en met de regexp replace bewerkte inhoud. Voor en na die actie doe ik een alert op die innerHTML. Je kunt dus simpel aan die inhoud van die alerts zien of er iets is aangepast.
Verder is het niet wijs om DOM en innerHTML te gebruiken. Met alleen DOM kom je er ook, je kunt alle nodes langslopen en alle comment nodes verwijderen.
Ok thanks, ik wist niet dat dat kon :)
r0bert schreef op donderdag 12 mei 2005 @ 00:18:
uitroepteken escapen?
en mssn
code:
1
.[^-->]*
Die code slaat nergens op. En puur <!-- replacen werkt wel. Dan hoef ik ook niets te escapen, dus dan zal het nu ook niet hoeven.
crisp schreef op donderdag 12 mei 2005 @ 00:27:
de m-modifier heeft alleen nut bij het gebruik van ^ (start of subject) of $ (end of subject) opties
een greedy match zou ik overigens ook niet aanraden bij dit soort dingen

ik denk dat je verder komt met de g-modifier (global match), anders houdt de regexp er sowieso na de eerste match mee op (en in dit geval ws al na de eerste line).
Die global modifier heb ik er normaal ook bij staan. Maar de ik weet uit eigen ervaring dat het fijn is om alles te strippen tot de essentie (ook voor mezelf) en dat heb ik dus gedaan. Maar bedankt voor de tip iig.


Ik ga straks dus proberen om die comments via de DOM manier er uit te werken. Maar ik wil altijd zo goed mogelijk weten waarom een andere mogelijkheid dan niet werkt. Dat weet ik nu nog niet, dus als iemand wat meer info of een oplossing heeft hiervoor, dan graag.

[ Voor 42% gewijzigd door Michali op 12-05-2005 09:41 ]

Noushka's Magnificent Dream | Unity


Verwijderd

je zoekt de s modifier, niet de m, . matched namelijk geen \n en met de s modifier wel. Je kan overigens ook [.\n]*? doen

print uit en hang op:
http://www.erudil.com/preqr.pdf

[ Voor 21% gewijzigd door Verwijderd op 12-05-2005 10:15 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Het hele probleem hier is dat de . geen newlines matched; dit werkt wel:
JavaScript:
1
p.innerHTML = p.innerHTML.replace(/<!--(.|[\r\n])*-->/g, '');

(Firefox heeft ook de \r nodig - bugje in FF vermoed ik...)

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Verwijderd schreef op donderdag 12 mei 2005 @ 10:12:
je zoekt de s modifier, niet de m, . matched namelijk geen \n en met de s modifier wel. Je kan overigens ook [.\n]*? doen
JS kent geen s (linespan) modifier. en hiermee:
code:
1
[.\n]

match je een letterlijke punt of een newline ;)

Intentionally left blank


Verwijderd

ik zou 'm alleen nog ungreedy maken crisp
code:
1
/<!--(.|[\r\n])*?-->/g


waarom matched [.\n] alleen een letterlijke punt (en newline)? ik geloof je meteen (heb het ook niet uitgeprobeerd), maar waarom is dat?

[ Voor 19% gewijzigd door Verwijderd op 12-05-2005 10:18 ]


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Verwijderd schreef op donderdag 12 mei 2005 @ 10:17:
ik zou 'm alleen nog ungreedy maken crisp
code:
1
/<!--(.|[\r\n])*?-->/g


waarom matched [.\n] alleen een letterlijke punt (en newline)? ik geloof je meteen (heb het ook niet uitgeprobeerd), maar waarom is dat?
Omdat het een character class is waar andere speciale characters gelden.

Blog [Stackoverflow] [LinkedIn]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Overigens mag er tussen de -- en de > whitespace zitten; dit is dus correcter:
code:
1
/<!--(.|[\r\n])*?--\s*>/g

Intentionally left blank


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Helemaal goed. Ik heb het al opgelost door met DOM door alle nodes te itereren en zo via nodeName commentaar te identificeren en dat werkt perfect. Nu weet ik tenminste wel waarom het niet werkte zodat ik de volgende keer sneller een oplossing kan vinden (hopelijk).

Noushka's Magnificent Dream | Unity

Pagina: 1