[Regex] Table

Pagina: 1
Acties:

  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Ik ben nieuw met regex, en ben al een paar dagen aan het klooien, heb in de search gezocht en ook op google maar heb het niet kunnen vinden.

Ik zou dus graag een TABLE willen regexxen naar UBB
maar alleen als de TABLE ook goed is opgebouwd.
Dus

<TABLE>
<TR>
<TD></TD>
<TD></TD>
</TR>
</TABLE>


De < en > moeten dus [ en ] worden.
Maar alleen wanneer de hele table klopt.

Ik krijg het wel voor elkaar om onafhankelijk alle tags te replacen met UBB, maar ik heb geen idee hoe ik ervoor zou kunnen zorgen dat hij een TD alleen naar UBB omzet als er ook een TABLE en TR voor staan.

Ik vraag hier niet om een script, maar om de methode.

Hoe zou ik dit aan kunnen pakken ???

Als dit niet mogelijk is, dan zit ik ook nog met het probleem dat wanneer ik met mijn huidige UBB code <TD></TD><TD></TD>
probeer te vervangen dat hij er dus dit van maakt:
[TD]</TD><TD>[/TD]

Dit komt door de volgende regex:
"<TD\>(.*?)</TD>", "[TD]\1[/TD]"

Hoe kan ik in deze regex zetten dat hij stopt bij de eerste < (tag open die hij tegenkomt ???

Alvast bedankt.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
In verband met de lees- en onderhoudbaarheid van je code zou ik de procedure opsplitsen in drie delen. Eerst alle <table>...</table> secties opsporen dus en deze omzetten naar
, waarbij je ... weer doorzoekt op <tr>...</tr> en vervolgens die ... weer op <td>...</td>. Je weet dan in ieder geval zeker dat je alleen tags in de juiste context vervangt. Je code wordt hier een stuk leesbaarder door. Verder wil je waarschijnlijk, dat alle tekst buiten <tr> en <td> tags uitsluitend uit whitespace bestaat, zodat je niet iets als '<table>blaat<tr></td></table>' krijgt.

Als (POSIX-style) reguliere expressies krijg je zoiets:
code:
1
2
3
table: <table>(([[:space:]]*tr)+)[[:space:]]*</table>
tr:    <tr>(([[:space:]]*td)+)[[:space:]]*</tr>
td:    <td>([^>]+)</td>

En voor het herkennen van table-secties dus zoiets (simpelweg bovenstaande definities ingevuld):
code:
1
<table>(([[:space:]]*<tr>([[:space:]]*<td>[^>]+</td>)+[[:space:]]*</tr>)+)[[:space:]]*</table>

Geen volledig antwoord, maar ik hoop dat ik je hiermee toch op weg heb geholpen.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ik denk dat je hiervoor beter een stackbased parser kunt schrijven, dan wordt je code waarschijnlijk ook een stuk leesbaarder/onderhoudbaarder.

Who is John Galt?


  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Bedankt allebei.

Ik zit in Coldfusion te regexxen :'( en die is niet zo uitgebreid als perl of php regex..

Ik ben al een stukje verder, maar als ik nu als input string het volgende heb:

<TABLE ....><TR><TD></TD></TR></TABLE>

en ik wil <TABLE ....> omzetten naar
[TABLE]

Dan doe ik dat momenteel zo:
code:
1
<CFSET S = ReReplaceNoCase(String, "<TABLE?[^>]", "[TABLE]", "all")>

Maar dan krijg ik dus als output:

[TABLE]....><TR><TD></TD></TR></TABLE>

Hoe kan ik ervoor zorgen dat hij ....> gewoon weglaat ???