Avatar billede verakso Nybegynder
01. oktober 2001 - 11:26 Der er 9 kommentarer og
2 løsninger

Søgning ved hjælp af RegExp

Howdy,

Jeg har lavet en lille function i ASP, der bruger RegExp, til at highlighte et ord man har søgt på.
For de nysgerrige ser den således ud:

<%

Function Highlight(sString,sHiglight)
    \' Regular Expression Object (Requires vbScript 5.0 and above)
    Dim regEx
   
    \' If no content was received, exit the function
    If sString            = \"\" Then Exit Function
   
    \' Create Regular Expression object
    Set regEx            = New RegExp
   
    \' Keep finding links after the first one.               
    regEx.Global        = True
   
    \' Ignore upper/lower case
    regEx.IgnoreCase    = True
       
    \' Look for Highligts
    regEx.Pattern        = \"(\" & sHiglight & \")\"
   
    \'Highligt context
    Highlight            = regEx.Replace(sString, \"<span class=\"\"highlight\"\">$1</span>\")

End Function
%>

Funktione virker nu godt nok, men uheldigvis highlighter den også HTML tags, hvilket ikke er særligt fedt, for hvis en eller anden nød søger på p, så forsøger koden at highlighte alle paragraph-tags, med et ret så uheldigt resultat til følge.

Mit spørgsmål er så bare nu, hvorledes kan jeg ekskludere HTML-tags i mit søge pattern?

100 points til dem der kan lede mig i rigtig retning af noget der virker.
Avatar billede stringbuffer Nybegynder
01. oktober 2001 - 11:51 #1
regEx.Pattern = \"([^<]|^)(\" & sHiglight & \")([^>]|$)\"

og så brug $2 istedet for $1 i din replace
Avatar billede stringbuffer Nybegynder
01. oktober 2001 - 11:58 #2
efter nærmere eftertanke så skal du bruge noget, der ligner det her:
regEx.Replace(sString, \"$1<span class=\"\"highlight\"\">$2</span>$3\")

Avatar billede verakso Nybegynder
01. oktober 2001 - 12:02 #3
He, jeg var liiige ved at skrive det til dig.
Well anyway, så lad mig lige teste det..

Jeg tror der mangler lidt . i det første udtryk, for den finder eks. stadigt style tags i HTML tagsne..
Avatar billede verakso Nybegynder
01. oktober 2001 - 12:30 #4
Hey vi er på rette vej...

Tror jeg, for der filtere godt nok visse HTML tags fra men hvis jeg søger på »special« og der findes en HTML tagt der liger:

<p class=\"special\">Dette er en special tag</p>, så forsøger den stadigt at udskifte det der står i paragraph tag\'en.

Men lad mig lige se om jeg i det hele taget fatter noget af Regulære udtryk.

Det ny pattern er splittet op i tre patterns hhv.
([^<]|^)
(\" & sHiglight & \")
([^>]|$)

Det første pattern siger at den ikke skal matche noget der indeholder < eller begynder med

Så kommer selve søgestrenge, intet ændret her,

Og endlig så skal den ikke matche på noget der ender med > og retsen af strengen..

Nogenlunde opfattet?

Det er forvirrer/driller lidt er ordenen af eks. det første pattern

| (Pipe) er jo lig med enten eller, så derfor læser jeg det første pattern som at den enten ikke skal medtage < eller tage resten af strengen...??

Jeg er stadigt lidt mystificeret..
Avatar billede eagleeye Praktikant
10. oktober 2001 - 19:39 #5
Jeg tror alle tage med mellem rum i går galt.
<p class=\"special\">  det er mellemrum mellem p og class. Prøv om den her ikke vikrer. Jeg har prøvet den lidt af og det ser umiddelbart godt ud. Jeg har ikke prøve med alle HTML tags så...

\"^([^<]|[^<\\/])[^\\w^\\.^\\s^=^\"\"]*^>|(\" & sHiglight & \")$\"
Avatar billede verakso Nybegynder
12. oktober 2001 - 09:20 #6
Nope stadigt ikke helt ok.
Eks. matcher en søgning på »i« også de i\'er der er i eks.
cellpadding=\"0\" cellspacing=\"0\"

Og så bliver det noget værre grimt html der bliver spyttet ud.

Det må da for pokker være muligt at lave et regulært udtryk der kun matcher på text der ligger imellem et \">\" & \"<\"

Jeg kan bare ikke hitte ud af det :(

Det må være noget i nærheden af
\"([<]|*)(\" & sHighlight & \")([>]|*)\"
Men det virker bare heller ikke...

Avatar billede eagleeye Praktikant
13. oktober 2001 - 00:57 #7
Jeg kan lave denne:

\"(<[\\w\\d\\s\\/\\=\\\"\"]*>)|(\" & sHighlight & \")\"

Den finde alle HTML tags og den finder alle steder hvor sHighlight er undtagen inde i HTML-tags.

Problemmet er så hvis du laver en hightlight med replace functionen så kommer der highlight TAGS efter hver HTML tag.
   
Avatar billede eagleeye Praktikant
13. oktober 2001 - 01:00 #8
Er det altid en HTML-fil du søger igennem?
Avatar billede eagleeye Praktikant
13. oktober 2001 - 01:18 #9
En anden.... Den her søger på shighlight mellem > og <:

objRegPath.Pattern = \"(>)([\\.\\w\\d\\s\\/\\=\\\"\"\\%]*)(\" & sHighlight & \")([\\.\\w\\d\\s\\/\\=\\\"\"\\%]*)(<)\"
strOutput = objRegPath.Replace(strInput, \"$1$2<b>$3</b>$4$5\")

Jeg har lavet highligh med <b></b>
Avatar billede verakso Nybegynder
15. oktober 2001 - 08:55 #10
Fandens, jeg giver snart op...

Jeg tror bare ikke ar der kan lykkedes at opnår det jeg egentlig vil, men brug af regulære udtryk.

Den tekst jeg søger igennem er _altid_ en eller anden slags af HTML, det er det desværre, da de informationer der skal vises er bliver spyttet ud som en næsten færdig HTML side fra Databasen, og det bliver ikke lavet om foreløbig.

Den jeg gerne ville opnå var, at når en bruger søger på en streng, så har jeg en anden Stored Procedure der finder de sider, hvor strengen indgår, men når siden så vises, ville det jo være rart om søgeordet bliv markeret. Det kunne jo være at det ord man søgte på stod aller nederst i teksten.

Jeg har prøvet at lege lidt videre med eagleeye\'s seneste tråd, ligeledes uden held. Den highlighter nemlig ikke alle søge ordene, kun det sidste.

Så jeg må nok erkende at regulære udtryk og mig ikke går videre godt i spænd sammen, slet ikke her til morgen.

Avatar billede verakso Nybegynder
31. oktober 2001 - 14:56 #11
PIS!

Jeg fik aldrig løst denne 100%

Ph*ck ASP, RegExp, HTML & IT i al almindelighed, men her tag jeres points!
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

IT-JOB

Politiets Efterretningstjeneste

Platform Engineer hos PET

Politiets Efterretningstjeneste

GenAI Specialist i PET