/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
REular exp til replace af ord
Fra : N9


Dato : 09-08-04 10:15

Hej

Jeg har en tekst streng med tags f.eks.

str = "<p>Dette er en test</p><div>Men test er ikke ok</div><p>< a
href='testlink.asp'>tryk her for at yderligere informationer</a></p>"

det jeg ville er at erstate "test" med f.eks. "<b><A STYLE=""background=#
640D00"" title="test beskrivelse">test</A></b>"

MEN selv testlink.asp skal den ikke erstate da det er en link og der vil gå
ged i tags til linket.
Håber i forstår og kan hjælpe

N9

 
 
Jens Gyldenkærne Cla~ (09-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-08-04 10:49

N9 skrev:

> MEN selv testlink.asp skal den ikke erstate da det er en link
> og der vil gå ged i tags til linket.

Prøv med noget a la:

rgx.pattern = ">[^<]*(test)[^<]*<"

Pattern skal fortolkes som følger:

1) Et ">"-tegn (der lukker en html-kode) => ">"
2) 0 eller flere tegn der ikke må være "<" => "[^<]*"
3) Det søgte ord test (parentesen er sat for at kunne henvise til
et match med $1 senere) => "(test)"
4) 0 eller flere tegn der ikke må være "<" => "[^<]*"
5) Et "<"-tegn

Regex'et forudsætter at al tekst er placeret i html-koder (svarende
til kravende i Strict-html), samt at evt. forekomster af ">" og "<"
i teksten er erstattet med &lt; hhv. &gt;

Det er ikke afprøvet.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

N9 (09-08-2004)
Kommentar
Fra : N9


Dato : 09-08-04 12:11

Function ReplaceTest(S, Pat)
Dim re
Set re = New RegExp
re.Pattern = "(>[^<]*(test)[^<]*<)"
re.IgnoreCase = True
re.Global = True
Pat = re.Replace(Pat, "\\$1")
ReplaceTest = re.Replace(S, "<div>Mig</div>")
End Function

str = "<p>Dette er en test</p><div>Men test er ikke ok</div><p>< a
ref='testlink.asp'>tryk her for at yderligere informationer</a></p>"
Response.Write ReplaceTest(str,"test")


jeg ved ikke lige hvad der er galt der, men resultat er:

Mig
/p>Mig
/div>
< a href='testlink.asp'>tryk her for at yderligere informationer

Jens Gyldenkærne Cla~ (09-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-08-04 12:25

N9 skrev:

> re.Pattern = "(>[^<]*(test)[^<]*<)"

Hvorfor har du parenteser om hele udtrykket?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

N9 (09-08-2004)
Kommentar
Fra : N9


Dato : 09-08-04 12:32


> Hvorfor har du parenteser om hele udtrykket?

godt spørgsmål, ved det ikke

Her er lige den nye

Function ReplaceTest(S, Pat)
Dim re
Set re = New RegExp
' Un-escape Pat
re.Pattern = ">[^<]*("& Pat &")[^<]*<"
're.Pattern = "([\?\*\+\.\|\{\}\\\[\]\(\)])"
re.IgnoreCase = True
re.Global = True
Pat = re.Replace(Pat, "\\$1")
' Udfør
re.Pattern = "(" & Pat & ")"
re.IgnoreCase = True
ReplaceTest = re.Replace(S, "<b>$1</b>")

End Function

str = "<p>Dette er en test</p><div>Men test er ikke ok</div><a
href=test.asp>tryk her for at yderligere informationer</a>"

Response.Write ReplaceTest(str,"test")

resultat er

Dette er en test

Men test er ikke ok
test.asp>tryk her for at yderligere informationer

Line i "test.asp>tryk her for at yderligere informationer"

er linket til /b

så kilde koden ser således ud:

<p>Dette er en <b>test</b></p><div>Men <b>test</b> er ikke ok</div><a href=
<b>test</b>.asp>tryk her for at yderligere informationer</a>

Jeg fatter intet

Takker



Jens Gyldenkærne Cla~ (09-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-08-04 20:41

N9 skrev:

> <p>Dette er en <b>test</b></p><div>Men <b>test</b> er ikke
> ok</div><a href= <b>test</b>.asp>tryk her for at yderligere
> informationer</a>

Du sætter alligevel paranteserne på med linjen her:

re.Pattern = "(" & Pat & ")"

Men der manglede så også noget i mit oprindelige forslag - vi skal
jo ikke kun bruge selve $1-matchet, men også det der kommer før og
efter. Her er en ændring af din funktion:

Function ReplaceTest(S, Pat)
Dim re
Set re = New RegExp

re.Pattern = "(>[^<]*)("& Pat &")([^<]*<)"
re.IgnoreCase = True
re.Global = True

ReplaceTest = re.Replace(S, "$1<b>$2</b>$3")

End Function


Den er testet og virker. Ideen er her at man med paranteser skaber
referencer til alle tre dele af pattern. Erstatningskoden siger så
at man skal have $1-3 præcis som før - men bare sætte <b></b> uden
om $2.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

N9 (10-08-2004)
Kommentar
Fra : N9


Dato : 10-08-04 07:33

> Den er testet og virker. Ideen er her at man med paranteser skaber
> referencer til alle tre dele af pattern. Erstatningskoden siger så
> at man skal have $1-3 præcis som før - men bare sætte <b></b> uden
> om $2.


Hej

Mange tak for hjælpen, men der er lige en (måske) lille ting.

hvis f.eks. jeg har str = "<p>TEST det er en test</p>"

Bliver det med lille "test" markeret med <b>, men det "TEST" der står med
stort bliver ikke til "bold", og det hjælper hellere ikke hvis det er med
lille bogstave.
Håber du også kan hjælpe med det lille problem.

MVH

N9




Jens Gyldenkærne Cla~ (10-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 10-08-04 10:01

N9 skrev:

> Bliver det med lille "test" markeret med <b>, men det "TEST"
> der står med stort bliver ikke til "bold", og det hjælper
> hellere ikke hvis det er med lille bogstave.

Jeg kan godt se problemet - og jeg nørklede noget tid med det i går
aftes uden at finde en brugbar løsning. Problemet er at den kode
jeg sendte i går kun finder og markerer én instans af det søgte i
hver html-del. Det går altså fint hvis der står:

<p>Her er en test</p><p>Denne test er <em>meget testet</em> og
tester videre</p>

- men det går galt i eksemplet her:

<p>Her er en streng med test, test og test i samme html-afsnit</p>

Du kan prøve at lege lidt med programmet RegexMaster:
<http://www.miningtools.net/> - det er ret genialt til at afprøve
forskellige regulære udtryk (det baserer sig på .NET-regex, men der
er ikke store forskelle til asp-regex).

Jeg fandt lige følgende side:
notestips.com :: Processing HTML using Regular Expressions
[ http://www.notestips.com/80256B3A007F2692/1/NAMO5RNV2S#17 ]

- den bruger javascript regex, men tager netop højde for problemet
med attributter. Den bør kunne omskrives til vbscript/regex, men
ellers kan du jo bruge den som den er.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

N9 (10-08-2004)
Kommentar
Fra : N9


Dato : 10-08-04 10:40

> - men det går galt i eksemplet her:

(\b[^<])(" & word & ")(>*)

Den virker med overstående, nogenlunde, men går kluder i den hvis str = "<a
href="index.asp">index</a>"
og den søger på asp, men ikke hvis jeg søger index, det er mærkelig.

> Du kan prøve at lege lidt med programmet RegexMaster:
> <http://www.miningtools.net/> - det er ret genialt til at afprøve
> forskellige regulære udtryk (det baserer sig på .NET-regex, men der
> er ikke store forskelle til asp-regex).
>
> Jeg fandt lige følgende side:
> notestips.com :: Processing HTML using Regular Expressions
> [ http://www.notestips.com/80256B3A007F2692/1/NAMO5RNV2S#17 ]

Takker jeg kigger på dem.

MVH
N9



Jens Gyldenkærne Cla~ (10-08-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 10-08-04 10:58

Jens Gyldenkærne Clausen skrev:

> [ http://www.notestips.com/80256B3A007F2692/1/NAMO5RNV2S#17 ]
>
> - den bruger javascript regex, men tager netop højde for
> problemet med attributter. Den bør kunne omskrives til
> vbscript/regex, men ellers kan du jo bruge den som den er.

Nu blev jeg nysgerrig - og endte med selv at omskrive den til asp-
kode. Funktionen herunder virker som ønsket. Bemærk at man godt kan
søge på flere ord ad gangen (de skal så adskilles med |):

Function markWord(S, aWords)
         ' Extract HTML Tags
       Dim re, vstrippedHTML, i, MatchArr, vTemp
       Set re = New RegExp

         re.Pattern = "<[^<>]*>"
          re.IgnoreCase = True
          re.Global = True

         ' Replace HTML tags
         Set MatchArr = re.Execute(S)
         vStrippedHTML = re.replace(S,"$!$")
         
         ' alert(vStrippedHTML);
         
         ' Replace search words
         Dim re2
         set re2 = New RegExp
         
         re2.Pattern = "(" + aWords + ")"
          re2.IgnoreCase = True
          re2.Global = True

         vTemp = re2.replace(vStrippedHTML,"<em
class=""highlight"">$1</em>")
         
         ' Reinsert HTML
         For i = 0 To MatchArr.Count -1
            vTemp = Replace(vtemp, "$!$", MatchArr(i),1,1)
         Next

         markWord = vTemp

End function


Teknikken er at fjerne alle html-elementer (incl. attributter) fra
strengen før man fremhæver søgeordene. Til sidst sættes html-
elementerne så ind igen. De to sidste argumenter til Replace-linjen
sikrer at vi kun erstatter én forekomst af $!$ ad gangen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408928
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste