Avatar billede skjoldby Nybegynder
08. december 2000 - 13:36 Der er 32 kommentarer og
1 løsning

HTML tegn skal delvist slettes

Hejsa.
Jeg har et problem med et script som skal slette alle HTML og XML tegn undtagen følgende:
<br>
<b></b>
<i></i>
<a href....><a/>

Jeg har prøvet alt muligt men intet er lykkedes endnu. Jeg vil helst ikke poste noget kode da det sikkert ødelægger kreativiteten på hvordan problemet kan løses. Jeg beder IKKE om et helt færdig lavet script (hvis du har et du vil dele, er det dog fint med mig), men ønsker en idé til hvordan jeg skal søge igennem en streng og fjerne de tegn jeg ikke ønsker.

På forhånd tak...

Mvh
Skjoldet
Avatar billede tdaugaard Nybegynder
08. december 2000 - 13:39 #1
Først laver du en Server.HTMLEncode() så gør du flg.

strHTML = Replace(strHTML, \"&lt;br&gt;\", \"<br>\")
strHTML = Replace(strHTML, \"&lt;b&gt;\", \"<b>\")
strHTML = Replace(strHTML, \"&lt;/b&gt;\", \"</b>\")
strHTML = Replace(strHTML, \"&lt;i&gt;\", \"<i>\")
strHTML = Replace(strHTML, \"&lt;/i&gt;\", \"</i>\")

<A HREF..> bliver en del sværere ...
Avatar billede tulle Nybegynder
08. december 2000 - 13:40 #2
Kan du ikke bruge noget InStr(Strengen, \"det du vil finde\")?
Så kan du slette tingene når du har fundet dem
Avatar billede tdaugaard Nybegynder
08. december 2000 - 13:42 #3
tulle:> det vil være alt for besværligt..
Jeg tror du skal bruge en RegExp replace til <a href>\'en ..
Avatar billede skjoldby Nybegynder
08. december 2000 - 13:49 #4
td>> Hvis jeg bruger dit forslag, så bliver koderne jo ikke slettet, men bare oversat og dermed vist som kode. Det er jeg ikke interesseret i. Kender ikke RegExp. den må jeg lige kigge lidt på.

tulle>> Jo, ved at bruge InStr kan man jo søge på alle \'<\', men de gange jeg har forsøgt mig har jeg fået script timeouts. Når den finder et tegn jeg ikke ønsker, skal det slettes. Hermed bliver strengen mindre. Når den finder et tegn jeg ønsker, skal scriptet faktisk til at starte forfra med at søge fra et nyt sted. Det har givet mig nogle voldsomme loops, som selvfølgelig ikke er rart rent performance-mæssigt og heller ikke hvis den timer out.
Avatar billede erikjacobsen Ekspert
08. december 2000 - 13:50 #5
strHTML = Replace(strHTML, \"<br>\",\"&lt;br&gt;\")

??
Avatar billede tdaugaard Nybegynder
08. december 2000 - 13:50 #6
DOH!!! Det må du undskylde .. jeg sidder og sover :-(
Så kan det sagtens laves med InStr ... skal jeg se om jeg kan få bikset noget sammen ?
Avatar billede erikjacobsen Ekspert
08. december 2000 - 13:51 #7
Nåh - sorry -efter en HTMLencode ;-)
Avatar billede tdaugaard Nybegynder
08. december 2000 - 13:51 #8
E.J.> ??
Avatar billede tdaugaard Nybegynder
08. december 2000 - 13:51 #9
*S*
Avatar billede skjoldby Nybegynder
08. december 2000 - 13:53 #10
Hvis du kan give mig nogle ideer til hvordan jeg kan få det til at fungerer ville det være fedt.
Det skulle jo gerne være en relativ hurtig funktion.
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:12 #11
<%
    Function RemoveHTML(strString)
        Index = 1
       
        Do
            Index = InStr(Index, strString, \"<\")
            If Index = 0 Then Exit Do
           
            EndIndex = InStr(Index, strString, \">\")
            strTag = LCase(Mid(strString, Index, (EndIndex - Index) + 1))
            strLeft = Left(strString, Index - 1)
            strRight = Right(strString, Len(strString) - EndIndex)
           
            If Not (strTag = \"<b>\" Or strTag = \"</b>\" Or strTag = \"<i>\" Or strTag = \"</i>\" Or strTag = \"<br>\" Or strTag = \"</a>\" Or Left(strTag, 8) = \"<a href=\") Then strTag = \"\"
           
            strString = strLeft & strTag & strRight
           
            Select Case (strTag > \"\")
                Case True:  Index = EndIndex
                Case False: Index = Index + 1
            End Select
        Loop
       
        RemoveHTML = strString
    End Function
   
    strHTML = \"<font size=\"\"2\"\" color=#000000><a href=\"\"noget.asp\"\"><b>noget <i>tekst</i></b></a></font>\"
    Response.Write RemoveHTML(strHTML)
%>

det funker HELT fint :-)
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:13 #12
I Perl er det simpelt. Der kan være lidt mere der skal laves i denne, men outputtet
er i hvert fald:




TEST


Her er en overskrift
<b>Og den er fed</b> og <i>kursiv</i>
<a href=\"http://www.jubii.dk\" target=\"_blank\"> JUBII </a>


------OG HER KOMMER SCRIPTET i Perl-------

$b = <<XXXX
<html>
<head>
<title>TEST</test>
</head>
<body>
<h1>Her er en overskrift</h1>
<b>Og den er fed</b> og <i>kursiv</i>
<a href=\"http://www.jubii.dk\" target=\"_blank\"> JUBII </a>
</body>
</html>
XXXX
;

$b =~ s/(<(br|b|i|\\/b|\\/i|a[^>]+|\\/a)>)/%%%\\2%%%/gim;
$b =~ s/(<[^>]+>)//gim;
$b =~ s/%%%([^%]+)%%%/<\\1>/gim;

print $b;
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:14 #13
Kan ASP ikke det samme med regulære udtryk?
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:16 #14
ASP kan godt RegExp\'s, jo .. men det er ikke helt på samme måde som den du bruger der i Perl ..
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:19 #15
Jamen, jeg kender ikke syntaksen i ASP - derfor Perl. Men som sagt, hvis
de siger ASP kan det der med regulære udtryk, så må de jo også kunne dette.
Og så ... synes jeg jo det er nemmere ... ;-)
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:23 #16
Med
  $b =~ s/(<((br|b|i|\\/b|\\/i|a|\\/a)[^>]+)>)/%%%\\2%%%/gim;
i stedet for
  $b =~ s/(<(br|b|i|\\/b|\\/i|a[^>]+|\\/a)>)/%%%\\2%%%/gim;
kan den så også klare parametre på de andre tags: <br clear=\"left\"> f.eks.
Og man kan jo skrive <B> - selv om det ikke er standard.
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:23 #17
Ups. skal være
  $b =~ s/(<((br|b|i|\\/b|\\/i|a|\\/a) [^>]+)>)/%%%\\2%%%/gim;
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:23 #18
Helt sikkert .. RegExp\'s er meget nemmere..

strOutput = \"bla bla .. \"
Set RegX = New RegExp

RegX.Pattern = \"([\\w\\._-]+@[\\w\\._-]+\\.[A-Za-z]{2,3}\\S*)\"
RegX.Global = True
RegX.IgnoreCase = True

strOutput = RegX.Replace(strOutput, \" <a href=\'http://$2\' target=\'_blank\'>$2</a> \")
       
Set RegX = Nothing

ovenstående skulle meget gerne lave email adresser i tekst om til links.
Avatar billede skjoldby Nybegynder
08. december 2000 - 14:27 #19
td>> Dit virker jo helt perfekt.

ek>> Perl siger mig intet. Jeg fatter slet ikke hvad der foregår i det du skriver. Men din idé er sej nok, hvis jeg kunne få skidtet til at virke med asp.

Som I kan se står jeg nu i et dilemma, da jeg spurgte efter en idé. td kom godt nok først med hans. Hvad gør jeg???
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:27 #20
Ja, det er sådan noget lignende i ASP. Jeg har en lille forbedring til
mit lille script:

$b =~ s/(<(((br|b|i|a)( [^>]+)?)|(\\/i|\\/b|\\/a))>)/%%%\\2%%%/gim;
Avatar billede erikjacobsen Ekspert
08. december 2000 - 14:28 #21
Jamen brug da bare hans! Du skal ikke tage dig af at jeg blander mig ;-)
Avatar billede skjoldby Nybegynder
08. december 2000 - 14:29 #22
td>>> har du i øvrigt et link lige ved hånden med noget mere dokumentation om RegExp? Det der i ms vbscript dok. forvirre mig squ mere end det gavner.
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:30 #23
Prøv at søge på www.google.com efter \"regular expressions\" så får du noget du kan bruge.. jeg gjorde det selv, men jeg har ikke nogle konkrete URL\'s..
Avatar billede skjoldby Nybegynder
08. december 2000 - 14:31 #24
ok. tak for hjælpen begge. Imponerende at folk stadig er så hurtige til at svare.
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:34 #25
Tjaa .. vi er nogle der sidder her hele dagen og laver ingenting .. ;o)
Avatar billede skjoldby Nybegynder
08. december 2000 - 14:52 #26
Hvis andre har brug for et udemærket linkt omkring regular expressions i asp så kig forbi:
http://www.4guysfromrolla.com/webtech/regularexpressions.shtml
Avatar billede tdaugaard Nybegynder
08. december 2000 - 14:53 #27
Yup .. that\'s it .. det var vist også den jeg stødte på ;-)
Avatar billede tdaugaard Nybegynder
08. december 2000 - 16:11 #28
Vha. erik\'s expression finder flg. alle forekomster af <b></b>,<i></i>,<br> og <a href..></a>... men det er sådan set lidt a\'la en Not match vi skal bruge for at replace alle andre med \"\".

Erik, aner du noget om, om det er muligt at lave en \"NOT\" expression ?

<%
    Set objRegExpr = New regexp
   
    objRegExpr.Pattern = \"(<(((br|b|i|a)( [^>]+)?)|(\\/i|\\/b|\\/a))>)\"
    objRegExpr.Global = True
    objRegExpr.IgnoreCase = True

    strSearchOn = \"Click <a href=\'noget.asp\'><b>h<i>e</i>re</b></a> to go to a place..\"

    Set colMatches = objRegExpr.Execute(strSearchOn)

    Response.Write colMatches.Count & \" matches found...<P>\"

    For Each objMatch in colMatches
        Response.Write server.HTMLEncode(objMatch.Value)
    Next

    Set colMatches = Nothing
    Set objRegExpr = Nothing
%>
Avatar billede erikjacobsen Ekspert
08. december 2000 - 19:53 #29
Beklager, td, det kan ikke. Man kan lave not på ét tegn, men ikke på
følger af tegn.

  Altså i ovenstående siger jeg f.eks. [^>], som betyder alle tegn
  overhovedet bortset fra >. Det er meget nemmere end at skrive dem
  alle 255. Og lidt nemmere end at skrive de to ranges, der skal til (hvor
  er nu min ascii tabel...)
Avatar billede tdaugaard Nybegynder
08. december 2000 - 19:59 #30
Surt :-(
Avatar billede skjoldby Nybegynder
18. december 2000 - 14:31 #31
Jeg har siddet og leget lidt med regular expressions og har fået nogenlunde fod på hvad det er der sker i td\'s eksempel. Men hvad sker der her i ej\'s:

$b =~ s/(<(((br|b|i|a)([^>]+)?)|(\\/i|\\/b|\\/a))>)/%%%\\2%%%/gim;
$b =~ s/(<[^>]+>)//gim;
$b =~ s/%%%([^%]+)%%%/<\\1>/gim;

Den første linje finder vel bare de tegn jeg ønskede, men hvad er de % tegn og hvad gør de efterfølgende linjer?
Avatar billede tdaugaard Nybegynder
18. december 2000 - 14:52 #32
skjoldby:> E.J.\'s eksempel er til Perl. Der skal ikke laves meget om for at det funker i RegExp i ASP.
Avatar billede skjoldby Nybegynder
18. december 2000 - 15:05 #33
Ja, jeg fandt ud af at regexp er jo faktisk sproguafhængigt. Men jeg kunne godt tænke mig at få ovenstående \"oversat\" til ASP eller i hvert fald en mindre forklaring.
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