Avatar billede bbe1379 Nybegynder
19. september 2003 - 16:13 Der er 26 kommentarer og
1 løsning

RegExp problem æøå

Hejsa alle i kode-eksperter,

...jeg har en en funktion, som erstatter udvalgte ord i en tekst med et link, og det fungerer perfekt - på nær når ordene indeholder æ,ø eller å

Jeg har forsøgt at ændre både LCID og codepage på siden - uden held.

Hvem kan komme med et bud på en work-around:

Her er koden:

lookupstr = "tekst tekst tekst tekst tekst tekst ord tekst tekst tekst "
word = "ord"

objRegExp.Pattern = "(\b" & word & "\b)"
set objMatches = objRegExp.Execute(lookupstr)

For Each objMatch In objMatches
strRet = Left(lookupstr, objMatch.FirstIndex) & "<a href=""link.asp"">"
strRet = strRet & objMatch.Value & "</a>"
strR
Next
Avatar billede bbe1379 Nybegynder
19. september 2003 - 16:16 #1
...det der går galt med æ, ø og å er, at hvis ordet der skal erstattes i teksten f.eks. er "gennemf" så erstatter den også "gennemf" i ordet "gennemføre" selvom jeg i mit RegExp har beskrevet at det skal gælde HELE ordet.
Avatar billede netro Nybegynder
19. september 2003 - 17:02 #2
Prøv lige med følgende pattern:

objRegExp.Pattern = "[\ ]{1,1}(" & word & "){1,1}[\ ]{1,1}"
Avatar billede eagleeye Praktikant
19. september 2003 - 17:08 #3
Jeg har haft noget ligne og bruger dette, måske det kan hjælpe, æøå er melig ikke noget som definere som tekst karakter som a-z gør.

<%
str = "tekst tekst tekst tekst gennemføre tekst gennemf tekst ord tekst tekst tekst "

ulovligeord = "gennemf"

Set regEx = New RegExp
regEx.Global = true
regEx.IgnoreCase = true
regEx.Pattern = "(^|[^.æøå])" & ulovligeord & "([^.æøå]|$)"
str = regEx.Replace (str," ")
Set regEx = Nothing

Response.Write str
%>
Avatar billede bbe1379 Nybegynder
19. september 2003 - 17:24 #4
netro >..det eneste den gør, er vel bare at checke efter mellemrum før og efter - er det ikke? I så fald kan den jo ikke bruges til første og sidste ord i en sætning.

eagleeye > ...jeg kigger lige lidt mere på det. Jeg er ikke helt ekspert til RegExp's - kunne du forklare lidt hvad de forskellige sektioner checker og gør?
Avatar billede bbe1379 Nybegynder
19. september 2003 - 17:28 #5
eagleeye > dit forslag er ikke helt godt - men tæt på.
Hvor ordet der skal erstattes f.eks. er "gennemf" så sker det også i ordet "gennemføre" - det skal det ikke. Kun hvis hele ordert passer. Kan du fixe det?
Avatar billede eagleeye Praktikant
19. september 2003 - 17:32 #6
Den replacer ikke gennemføre hos mig. hvordan ser din streng så ud?
Avatar billede netro Nybegynder
19. september 2003 - 17:33 #7
bbe1379 -> Jo, det har du ret i. Men den kan jo hurtig laves om til også at tage første og sidste ord.
Avatar billede eagleeye Praktikant
19. september 2003 - 17:35 #8
De to forslag er meget lig hinanden, netro bruger mellemrum før og efter den jeg har vist søger efter noget som ikke er et tegn eller æøå og så tager min første og sidste ord med..

Dette pattern kan du måske bruges så:

"(^|[\s]{1,1})" & word & "([\s]{1,1}|$)"
Avatar billede eagleeye Praktikant
19. september 2003 - 17:36 #9
Denne  ^ matcher start på strengen og denne $ matcher slut på strengen.
Avatar billede eagleeye Praktikant
19. september 2003 - 17:38 #10
Avatar billede bbe1379 Nybegynder
19. september 2003 - 17:39 #11
Det er faktisk når der ikke er æ, ø eller å i strengen

str = "Økonomi og responsberegning"
ulovligeord = "respons"

Bliver til:
Økonomi og eregning
Avatar billede netro Nybegynder
19. september 2003 - 17:39 #12
"tekst tekst tekst tekst gennemføre tekst gennemf tekst ord tekst tekst tekst "

- bliver til:

"tekst tekst tekst tekst tekst gennemf tekst ord tekst tekst tekst "
Avatar billede eagleeye Praktikant
19. september 2003 - 17:39 #13
Når man skriver sådan her så:  "(^|[\s]{1,1})"
Matcher den start på strengen  ELLER et mellemrum/tab/newline
| = ELLER
\s = space karakter
Avatar billede eagleeye Praktikant
19. september 2003 - 17:40 #14
Prøv det som vist i 19/09-2003 17:35:53

objRegExp.Pattern = "(^|[\s]{1,1})" & word & "([\s]{1,1}|$)"
Avatar billede eagleeye Praktikant
19. september 2003 - 17:44 #15
og bare drop det {1,1} forøvrigt.
Avatar billede bbe1379 Nybegynder
19. september 2003 - 17:46 #16
eagleeye > den ser ud til at virke fint. Eneste lille problem er, at dens objMatch.FirstIndex ligger én før ordet - men det skal jeg nok finde ud af.
Avatar billede bbe1379 Nybegynder
19. september 2003 - 17:50 #17
..og dog - man kan jo ikke bare sige objMatch.FirstIndex + 1. Hvis ordet er de første i en sætning splitter den strengen forkert op.

Nogle ideér?
Avatar billede eagleeye Praktikant
19. september 2003 - 17:58 #18
ja det kan jeg se, det frodi den finde et mellemrum som er lige før ordet og ved start på strengen er der ikke noget mellerum så der passer FirstIndes.. nej kan det være ved at tjekke om den er 0??

i = objMatch.FirstIndex
if i > 0 then i = i + 1
Avatar billede eagleeye Praktikant
19. september 2003 - 18:07 #19
i = objMatch.FirstIndex
if i > 0 then i = i + 1
strRet = Left(lookupstr, i)


Den matcher entent Start på strengen (^) eller et mellemrum (\s) det ord som er i word og et mellemrum(\s) eller Slut på strengen ($)
Avatar billede bbe1379 Nybegynder
19. september 2003 - 18:18 #20
Hvad hvis der er et punktum eller komma lige efter ordet? Hvordan tackler den det?

...bare svar -  pointene er dine.
Avatar billede eagleeye Praktikant
19. september 2003 - 19:00 #21
Ok..jeg var lige ved at spise ;)
Sådan her så kan der være , eller . efter.. men det kommer med i matchen..
Du kan tilføje flere karakter som skal med i den sidste ([,\.\s]|$):

objRegExp.Pattern = "(^|[\s])" & ulovligeord & "([,\.\s]|$)"
Avatar billede eagleeye Praktikant
19. september 2003 - 19:01 #22
hov ulovligeord  --> word

objRegExp.Pattern = "(^|[\s])" & word & "([,\.\s]|$)"
Avatar billede bbe1379 Nybegynder
19. september 2003 - 22:23 #23
Det lyder helt fint - takker!
Avatar billede bbe1379 Nybegynder
22. september 2003 - 19:16 #24
eagleeye > Hey - jeg er løbet ind i nogle flere problemer med det regExp. Håber du kan hjælpe igen.

Jeg har også brug for at den kan genkende ord, hvis der står html-koder på hver side. F.eks. "<b>" eller "<li>". Det virker ikke at tilføje dem som karakterer sammen med "," og "." for matchen starter åbenbart ved første karakter (f.eks. ved "<" i "<li>"), og det giver en forkert replace.

Sig til hvis det kræver flere point :)
Avatar billede bbe1379 Nybegynder
22. september 2003 - 20:14 #25
Jeg er kommet frem til følgende, men aner ikke om det holder.

objRegExp.Pattern = "(^|[\s]|<[^>]*>)" & wordRS("word") & "(<[^>]*>|[,\.\s]|$)"

...umiddelbart virker det, men måske kan du sige om der er "uhensigtmæssigheder" i det.
Avatar billede eagleeye Praktikant
22. september 2003 - 20:47 #26
Det ser fint ud, jeg har også prøve med den. Det jeg lige tænke på var med hvis man bruger tegne < og > men det lader til den ikke falder i på det.
Avatar billede bbe1379 Nybegynder
22. september 2003 - 21:03 #27
kuul - og takker igen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester