[ASP] tag naar kleine letters...

Pagina: 1
Acties:

  • licensed
  • Registratie: Augustus 2002
  • Laatst online: 24-01 20:57
Het is niet moeilijk om tags uit een string te filteren, maar nu wil ik ze vervangen door dezelfde tag, maar dan met alleen maar kleine letters.

ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
Function toLTag(str)
  dim regEx    
  Set regEx = New RegExp
  regEx.Pattern = "(<\S[^>]*>)"
  regEx.IgnoreCase = True 
  regEx.Global = True
  toLTag = regEx.Replace(str, ...)
End Function


Ik heb geen idee wat ik op de puntjes moet invullen.
LCase("$1") ofzo werkt natuurlijk niet.

Wie heeft er een idee?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

licensed schreef op 20 oktober 2004 @ 20:51:
LCase("$1") ofzo werkt natuurlijk niet.
Zo natuurlijk vind ik dat niet klinken, het is wel de manier die ik zou gebruiken. Krijg je een foutmelding als je dat doet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

doe je toch even str=lcase(str) als eerste opdracht in je functie, of begrijp ik het niet?

  • mklerx
  • Registratie: April 2000
  • Laatst online: 20-05 15:29
Verwijderd schreef op 20 oktober 2004 @ 21:16:
doe je toch even str=lcase(str) als eerste opdracht in je functie, of begrijp ik het niet?
TS wil alleen de HTML tags lowercase, niet wat er tussen in staat.

Lcase("$1") werkt inderdaad niet, als je hier mijnfunctie("$1") van maakt is de parameter van mijnfunctie letterlijk $1 en niet de waarde van de gematchte variabele. Ik zoek me de hele tijd al rot, maar kan echt niet zoiets vinden als preg_replace_callback in PHP. Zo te zien kun je in ASP de gematchte waarde niet door een functie laten halen....

[ Voor 14% gewijzigd door mklerx op 20-10-2004 21:22 ]


  • licensed
  • Registratie: Augustus 2002
  • Laatst online: 24-01 20:57
Inderdaad, daar lijkt het wel op. Ik wordt er een beetje wanhopig van :'(

Verwijderd

ah, ik ken het regexobject niet (asp ook niet - wat doe ik hier) en heb even gegoogeld. je zou mss heel omslachtig met str splitten in een array je doel kunnen bereiken. volgens mij kun je beter gewoon even met instr() alle '<' en '>' zoeken en daarna de str terug samenstellen met str=left(str,instr("<")) & "<" & lcase(mid(str(instr("<",....) & ">" & right str(str,instr(....)) enz. (wel in tijdelijk vars zetten en laatste twee gevonden posisties bijhouden om alle < & > netjes te kunnen aflopen en om achteraf correct terug samen te kunnen stellen. daarna door de regex halen als je daar nog andere dingen mee moet doen op de str.

  • mklerx
  • Registratie: April 2000
  • Laatst online: 20-05 15:29
Kom heel erg vaak oplossingen in ASP.Net tegen, maar ik denk dat je toch op de manier van _heretic_ terecht komt. Kan ook, en is iets meer code maar dan kan het inderdaad wel. Ik zou mijn tijd verder maar besteden om het zo te zien in plaats van verder te zoeken naar een schijnbaar hopeloze zaak.
Succes :P

  • licensed
  • Registratie: Augustus 2002
  • Laatst online: 24-01 20:57
Ok, ik heb het heel anders gedaan en het werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function toLTag(str)
  dim regEx, rtrn
    rtrn = ""
  Set regEx = New RegExp
  regEx.Pattern = "(.*?)(<\S[^>]*>)"
  regEx.IgnoreCase = True 
  regEx.Global = True
    Set Matches = regEx.Execute(str)
    For Each match In Matches
        Set subMatches = match.Submatches
        For Each Submatch In subMatches
            If regexTest("<\S[^>]*>", SubMatch) Then
                rtrn = rtrn & LCase(SubMatch)
            Else
                rtrn = rtrn & SubMatch
            End If
        Next
    Next
  toLTag = rtrn
End Function

  • licensed
  • Registratie: Augustus 2002
  • Laatst online: 24-01 20:57
Helaas, dit is toch niet helemaal goed.

Deze string:
code:
1
2
"Hallo, dit is tekst OP de WEBsite <A href='blaBLabla.asp'>Test</A> Hier
begint een nieuwe zin..."

wordt:
code:
1
Hallo, dit is tekst OP de WEBsite <a href='blablabla.asp'>Test</a>


De tweede zin wordt niet meegenomen en de hoofdletters in de href zijn weg en die mogen wel blijven.
Hoe krijg ik dat tweede deel van de zin er weer bij?

[ Voor 10% gewijzigd door licensed op 20-10-2004 22:40 ]


  • licensed
  • Registratie: Augustus 2002
  • Laatst online: 24-01 20:57
Na, 'k wordt helemaal gek.. 't lukt me niet om een regexp te schrijven die tags en gewone tekst apart captured. Hij captured alleen tekst, gevolgd door een tag, dus als na een tag alleen nog tekst komt matcht ie dat niet.

Wie helpt mij uit de brand?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Doe eens een paar minuutjes Googlen naar tokenizing en lexical scanning. :)

[ Voor 21% gewijzigd door NMe op 22-10-2004 00:38 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Regexp'en zijn geen generieke parsers. In het bijzonder kunnen ze erg slecht tegen geneste syntax, en XML/HTML is bij uitstek genest. Volgens mij is het eenvoudiger over elk karakter te itereren. Hou een boolean in_tag bij:
code:
1
2
3
4
5
6
7
8
boolean in_tag = false;
while ( karakters in string )
  if ( karakter == '<' )
    in_tag = true;
  else if ( karakter == '>' )
    in_tag = false;
  else if (in_tag)
    karakter  = lowercase(karakter)

[ Voor 5% gewijzigd door MSalters op 22-10-2004 00:08 . Reden: tags ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

't lukt me niet om een regexp te schrijven die tags en gewone tekst apart captured. Hij captured alleen tekst, gevolgd door een tag, dus als na een tag alleen nog tekst komt matcht ie dat niet.
Het match object heeft een length en offset (geloof property dat zo heet). Als je de offset+length van de vorige match onthoudt en die vergelijkt met de huidige dan heb je startpositie en de lengte van de tekst tussen de matches en die kun je dan met Mid(...) mee kopieëren.

[ Voor 31% gewijzigd door Verwijderd op 22-10-2004 16:47 ]


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Om even een oud scriptje van mezelf te posten:

code:
1
2
3
4
5
6
7
8
    Set FindB = New RegExp
    With FindB
        .Pattern = "\\[b\]((.|\n)+?)\\[/b\]"
        .Global = True
        .IgnoreCase = True
    End With

    TekstInput = FindB.Replace(TekstInput, "<b>$1</b>")


Dit heeft altijd goed gewerkt hoor. Het Matches object heeft die mogelijkheid idd niet.

Die eerste parenthesis (dus dit hele stukje: ((.|\n)+?) ) bevat dus de inhoud van $1.

Certified smart block developer op de agile darkchain stack. PM voor info.

Pagina: 1