Ik ben al twee dagen bezig met het bedenken van een manier waarop ik bepaalde span-tags in HTML kan veranderen. Ik kom er maar niet uit
Het gaat om het volgende: Op een gegeven moment heb ik een stuk HTML waarin speciale tags in staan die vervangen moeten worden:
Moet worden:
In principe levert dit geen probleem op, ik gebruik er regular expressions onder ASP voor, en dat gaat prima
Maar het probleem is wanneer geneste span-tags gebruikt worden. Zoals:
Ik moet nu dit zo gaan 'parsen' dat alleen de buitenste "icstag"-span-tag blijft staan. Alles wat er binnen staat mag weg. Het resultaat van bovenstaande HTML zou dan moeten zijn:
Met de ASP code die ik al had gaat dit niet lukken, omdat die als afsluitende tag de eerst </span> kiest. Maar als er sprake is van geneste tags gaat het dus fout, omdat de buitenste </span> later in de HTML staat.
Ik loop m'n hoofd nu al twee dagen te breken over dit probleem. Het lijkt zo simpel, maar ik kom er maar niet uit
Moet ik gaan bijhouden hoeveel <span>-tags er zijn geopend ofzo?
Mijn probeersels staan op http://peter.icrew.nl/reg.asp en de code die daarvoor:
Volgens mij zit er ook wat kromme code tussen, of kan dit gewoon niet anders? Pff ik zie het echt ff niet meer.
Iemand nog een goed idee om me verder op weg te helpen?
/Edit: waarom werkt die asp code parses niet
Het gaat om het volgende: Op een gegeven moment heb ik een stuk HTML waarin speciale tags in staan die vervangen moeten worden:
HTML:
1
| <span type="icstag" unit="1" unitid="2" templateid="3">content</span> |
Moet worden:
HTML:
1
| <insert_unit unit="1" unitid="2" templateid="3" /> |
In principe levert dit geen probleem op, ik gebruik er regular expressions onder ASP voor, en dat gaat prima
Maar het probleem is wanneer geneste span-tags gebruikt worden. Zoals:
HTML:
1
2
3
4
5
6
7
8
9
10
| <span type="icstag" unit="1" unitid="2" templateid="3"> content <span type="icstag" unit="4" unitid="5" templateid="6"> nog meer content </span> blablabla <span> iets in de span </span> </span> |
Ik moet nu dit zo gaan 'parsen' dat alleen de buitenste "icstag"-span-tag blijft staan. Alles wat er binnen staat mag weg. Het resultaat van bovenstaande HTML zou dan moeten zijn:
HTML:
1
| <insert_unit unit="4" unitid="5" templateid="6" /> |
Met de ASP code die ik al had gaat dit niet lukken, omdat die als afsluitende tag de eerst </span> kiest. Maar als er sprake is van geneste tags gaat het dus fout, omdat de buitenste </span> later in de HTML staat.
Ik loop m'n hoofd nu al twee dagen te breken over dit probleem. Het lijkt zo simpel, maar ik kom er maar niet uit
Mijn probeersels staan op http://peter.icrew.nl/reg.asp en de code die daarvoor:
ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
| sHTML = "Blablabla<br><span contenteditable=""false"" style=""BORDER: red 1px dashed; MARGIN: 2px;"" unitid=""79"" unit=""4"" type=""icstag"" templateid=""21""> {CONTENT} </span> <p>blabla2</p> <span>hoi</span> hallo <span contenteditable=""false"" style=""BORDER: red 1px dashed; MARGIN: 2px;"" unit=""1"" unitid=""2"" type=""icstag"" templateid=""3""> <span contenteditable=""false"" style=""BORDER: red 1px dashed; MARGIN: 2px;"" unitid=""79"" unit=""4"" type=""icstag"" templateid=""21""> hoi </span>Mjah </span>" Response.Write("<b>HTML-string:</b> " & Server.HTMLEncode(sHTML) & "<br><br>") Dim objRegExp Set objRegExp = New RegExp objRegExp.IgnoreCase = True objRegExp.Global = True Dim Match, Matches, sSpan, blnIcsTag, blnContentEditable Dim MatchesAttributes, MatchAttributes, blnValidIcsTag Dim iUnit, iUnitID, iTemplateID objRegExp.pattern = "(<span((.|\n)*?)>((.|\n)*?)</span>)" Set Matches = objRegExp.Execute(sHTML) For Each Match in Matches blnValidIcsTag = false 'De span-tag sSpan = Match.SubMatches(0) Response.Write("<b>Span-tag:</b> " & Server.HTMLEncode(sSpan) & "<br>") 'Controleren of dit een insert_unit is objRegExp.pattern = "type=""icstag""" blnIcsTag = objRegExp.test(sSpan) objRegExp.pattern = "contenteditable=""false""" blnContentEditable = objRegExp.test(sSpan) if (blnIcsTag AND blnContentEditable) Then Response.Write("<em>Valid tag found, now extracting attributes:</em><br>") 'Haal de attributen eruit objRegExp.pattern = "\sunit=""([0-9]+)""" Set MatchesAttributes = objRegExp.Execute(sSpan) if MatchesAttributes.count > 0 Then iUnit = MatchesAttributes(0).SubMatches(0) Response.Write("<b>Unit:</b> " & iUnit & "<br>") Response.Write("<em>Unit valid, moving on to next attribute</em><br>") 'UnitID objRegExp.pattern = "\sunitid=""([0-9]+)""" Set MatchesAttributes = objRegExp.Execute(sSpan) if MatchesAttributes.count > 0 Then iUnitID = MatchesAttributes(0).SubMatches(0) Response.Write("<b>UnitID:</b> " & iUnitID & "<br>") Response.Write("<em>UnitID valid, moving on to next attribute</em><br>") 'TemplateID objRegExp.pattern = "\stemplateid=""([0-9]+)""" Set MatchesAttributes = objRegExp.Execute(sSpan) if MatchesAttributes.count > 0 Then iTemplateID = MatchesAttributes(0).SubMatches(0) blnValidIcsTag = true Response.Write("<b>TemplateID:</b> " & iTemplateID & "<br>") Response.Write("<em>TemplateID valid, icstag is valid</em><br>") else Response.Write("<em>Template invalid, procedure stopped</em><br>") end if else Response.Write("<em>UnitID invalid, procedure stopped</em><br>") end if else Response.Write("<em>Unit invalid, procedure stopped</em><br>") end if end if if blnValidIcsTag Then Response.Write("<em>Now rewriting span-tag to insert_unit-tag</em><br><br>") objRegExp.pattern = sSpan sHTML = objRegExp.Replace(sHTML, "<insert_unit unit=""" & iUnit & """ unitid=""" & iUnitID & """ templateid=""" & iTemplateID & """ />") else Response.Write("<em>No icstag, just moving on to the next match</em><br><br>") end if Next Response.write("<b>Output:</b> " & Server.HTMLEncode(sHTML)) |
Volgens mij zit er ook wat kromme code tussen, of kan dit gewoon niet anders? Pff ik zie het echt ff niet meer.
Iemand nog een goed idee om me verder op weg te helpen?
/Edit: waarom werkt die asp code parses niet
[ Voor 21% gewijzigd door Priet op 19-10-2004 11:15 ]
"If you see a light at the end of a wormhole, it's probably a photon torpedo!"