[JS] RegEx probleem

Pagina: 1
Acties:

  • Dope-E
  • Registratie: Januari 2001
  • Laatst online: 11-07 12:42

Dope-E

The one and only Dope

Topicstarter
IK ben met een functie bezig die HTML code op een bepaalde manier moet parsen:
voorbeeld pagina:
HTML:
1
2
3
4
5
6
7
8
9
10
11
bla bla<BR><BR>
<TABLE cellSpacing=1 cellPadding=1 width=200 border=1>
<TBODY>
<TR>
<TD></TD>
<TD></TD></TR>
<TR>
<TD></TD>
<TD></TD></TR></TBODY></TABLE>
<BR>
nog meer bla

Nou wil dmv een regular expression de hele TABLE eruit zien te halen, maar dit wil niet echt lukken. Tot nu toe heb ik dit, maar das dus nie goed:
JavaScript:
1
/<TABLE [.\n]*(?!<TABLE)[.\n]*<\/TABLE>/

Er mag geen table binnen de gevonden table staan, vandaar de (?!TABLE)

Wat doe ik fout :?

twitter.com/curly_sanders


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:05

crisp

Devver

Pixelated


Ten eerste: een punt in een characterclass matched letterlijk een punt; wil je op alles matchen inclusief newlines moet je sowieso al aangeven dat je multi-line wilt matchen mbv de m modifier, en bij gebrek aan een PCRE DOT-ALL modifier deze constructie gebruiken:

code:
1
/(.|\n)*/m


verder staat de look-ahead assertion op de verkeerde plek; een eventuele geneste <TABLE wordt al gematched voordat de assertion wordt gechecked. Dit werkt wel:

code:
1
/((.|\n)(?!<TABLE))*/mi


de i-modifier is nu ook handig voor het geval TABLE in lowercase geschreven is :)

echter zijn we er nog niet; de match is nu greedy, dus matched niet tot aan de eerste </TABLE> maar tot aan de laatste. Dus passen we een non-greedy modifier toe en wordt de gehele regexp:

code:
1
/<TABLE((.|\n)(?!<TABLE))*?<\/TABLE>/mi


of een alternatief (die waarschijnlijk sneller is):

code:
1
/<TABLE([^<]|<(?!TABLE))*?<\/TABLE>/mi


:)

Intentionally left blank


  • Dope-E
  • Registratie: Januari 2001
  • Laatst online: 11-07 12:42

Dope-E

The one and only Dope

Topicstarter
I O U Crisp! _/-\o_

thx!

twitter.com/curly_sanders