Avatar billede drengen Nybegynder
17. april 2004 - 20:32 Der er 8 kommentarer og
1 løsning

Ekskludere HTML kode fra søgning i tekst med HTML-kode

Jeg er stødt på en udfordring ifm. en ASP opgave.

Problemet er at der skal foretages en søg-erstat søgning i en tekst-streng, som indeholder HTML-formateret tekst.

Søgningen skal erstatte fundne søgeord med f.eks. fred skrift.

Sidstenævnte, altså at erstatte funde søgeord, er ikke noget problem, men skaber et problem, hvis du netop ikke ignorerer evt. HTML-kode.

Fordi, hvis du f.eks. søger efter "bo" i den HTML-formaterede tekst, vil søgningen erstatte "bo" i  f.eks. "border:xxx;"(et stykke HTML/CSS i strengen). Det kan resultere i nogle meget uønskede resultater.

Derfor skal søgningen altså ignorere al HTML-kode, og dét er problemet.

Hvordan knækker man den?


Kim Andersen
Avatar billede thesurfer Nybegynder
17. april 2004 - 21:18 #1
Jeg er sikker på at det kan klares med nogle RegExp udtryk.. men kender ikke noget til det..
Det gør roenving, olebole, ericjacobsen, eagleeye (?)..
Avatar billede nozio Nybegynder
18. april 2004 - 17:44 #2
Prøv denne function:

Function stripHTML(strHTML)
'Strips the HTML tags from strHTML
    strHTML = Replace(strHTML,"<BR>"," ")
  Dim objRegExp, strOutput
  Set objRegExp = New Regexp

  objRegExp.IgnoreCase = True
  objRegExp.Global = True
  objRegExp.Pattern = "<(.|\n)+?>"

  'Replace all HTML tag matches with the empty string
  strOutput = objRegExp.Replace(strHTML, "")
 
  'Replace all < and > with &lt; and &gt;
  strOutput = Replace(strOutput, "<", "&lt;")
  strOutput = Replace(strOutput, ">", "&gt;")
 
  stripHTML = strOutput    'Return the value of strOutput

  Set objRegExp = Nothing
End Function
Avatar billede drengen Nybegynder
18. april 2004 - 17:57 #3
Så er vi halvvejs gennem problemet, fordi al den HTML kode man stripper teksten for med din funktion, skal ind i teksten igen, efter søgningen, det er problemet. Teksten skal altså strippes for HTML kode under søgningen, men skal vises MED HTML kode efter søgningen.
Avatar billede ellebaek Nybegynder
18. april 2004 - 21:38 #4
<html>
<head>
<title>markWord</title>
<script language="JavaScript" type="text/javascript">
<!--
    function doMark(str, word) {
        return str.replace(new RegExp(word, "gi"), "<span style='background: #ffff33'>"+word+"</span>")
    }

    function markWord(id, needle) {
        if ( document.getElementById ) {
            var elm = document.getElementById(id);
        } else if (document.all) {
            var elm = document.all[id];
        } else {
            return; // sorry, NS4 er ikke med.
        }

        // Initialiser variabler
        var out = "";
        var haystack = elm.innerHTML;

        if (haystack.indexOf('<') == -1 || haystack.indexOf('>') == -1) {
            // Hvis ikke vi finder et < eller et > i haystack, er der ingen grund til at lede efter noget. Vi kan parse alt
            out = doMark(haystack, needle);
        } else {
            // Ellers må vi parse igennem for tags
            while (haystack.indexOf('<') != -1 && haystack.indexOf('>')) {
                // Alt indtil < skal parses
                out += doMark(haystack.substring(0, haystack.indexOf('<')), needle);
                // Alt fra < til > skal ignoreres
                out += haystack.substring(haystack.indexOf('<'), haystack.indexOf('>')+1)
                // Fjern det parsede stykke fra "høstakken"
                haystack = haystack.substring(haystack.indexOf('>')+1,haystack.length);
            }
            // Husk den sidste lille rest efter sidste tag
            out += doMark(haystack, needle);
        }

        // Skriv resultatet til browseren
        elm.innerHTML = out;
    }
//-->
</script>
</head>

<body onload="markWord('a','a');">
<span name="a" id="a">
abc<table><tr><td>
<table><tr><td>
Lorem est a ipsum test dolor sit amet, consectetuer adipiscing elit, sed diam amex nonummy nibh euismod
tincidunt ut laoreet dolore magna aliquam erat volutpat.
Ut wisi enim des ad minim <a href="http://www.testarea.dk" target="_blank">www.testarea.dk</a>, quis nostrud exerci tation ullamcorper suscipit nfo lobortis
nisl ut aliquip ex ea commodo consequat.
</td>
</tr></table>
</td><td>
Lorem est a ipsum dolor sit amet, consectetuer adipiscing elit, sed diam amex nonummy nibh euismod
tincidunt ut laoreet dolore magna aliquam www.testarea.dk erat volutpat.
Ut wisi enim des ad minim veniam, quis nostrud exerci tation ullamcorper suscipit nfo lobortis
nisl ut aliquip ex ea commodo consequat.</td>
</tr></table>jj
</span>
</body>
</html>

Jeg har success med det her eksempel. Prøv det, det er lidt anderledes end det du har nu, men det fungere lidt anderledes end det du vil frem til, men prøv det, det kan være du kan få det til at virke..
Avatar billede drengen Nybegynder
18. april 2004 - 22:19 #5
Den er meget tæt på nu, tak ellebaek.
Jeg forstår dog ikke helt hvad der sker i følgenden funktion:

function doMark(str, word) {
  return str.replace(new RegExp(word, "gi")...
}

Mere specifikt "gi" ?

Og har du et tip til hvordan man beholder sin case, fordi den laver alle fundne "någle" til lower case?
Avatar billede thesurfer Nybegynder
18. april 2004 - 22:23 #6
Der er også http://www.eksperten.dk/artikler/16

java script:(function(){var i,j,cI=0,count,tA,tmpN,pN,s='%s',dv,a=new Array(),colors=new Array("lime","yellow","aqua","red");tA=document.getElementsByTagName("mozjshlightex");for(i=tA.length-1;i>=0;i--){pN=tA[i].parentNode;for(j=0;j<tA[i].childNodes.length;j++){tmpN=tA[i].childNodes[j].cloneNode(true);pN.insertBefore(tmpN,tA[i]);}pN.removeChild(tA[i]);pN.normalize();}if(s==null||s.length==0||s=="%"+"s")return;while(s.indexOf("\"")!=-1){i=s.indexOf("\"");a=a.concat(s.substring(0,i).split(" "));s=s.substring(i+1);i=s.indexOf("\"");if(i==-1){i=s.length}a[a.length]=s.substring(0, i);s=s.substring(i+1)}a=a.concat(s.split(" "));dv=document.defaultView;function searchWithinNode(node,te,len,color){var pos,skip,sNode,mBit,eBit,mClone;skip=0;if(node.nodeType==3){pos=node.data.toUpperCase().indexOf(te);if(pos>=0){sNode=document.createElement("mozjshlightex");sNode.style.backgroundColor=color;sNode.style.color="black";mBit=node.splitText(pos);eBit=mBit.splitText(len);mClone=mBit.cloneNode(true);sNode.appendChild(mClone);mBit.parentNode.replaceChild(sNode,mBit);++count;skip=1;}}else if(node.nodeType==1&&node.childNodes&&node.tagName.toUpperCase()!="SCRIPT"&&node.tagName.toUpperCase()!="STYLE"&&node.tagName.toUpperCase()!="TEXTAREA"){for(var child=0;child<node.childNodes.length;++child){child=child+searchWithinNode(node.childNodes[child],te,len,color)}}return skip;}for(i=0;i<a.length;i++){if(a[i]==null||a[i].length==0)continue;count=0;searchWithinNode(document.body,a[i].toUpperCase(),a[i].length,colors[cI%colors.length]);cI++}})();
Avatar billede thesurfer Nybegynder
18. april 2004 - 22:25 #7
in-action: http://sstuhr.dk/

Skriv et par ord i tekstboksen øverst, og klik på den gule blyant-tingest..
Avatar billede drengen Nybegynder
19. april 2004 - 01:06 #8
ellebaek, jeg har brugt det javascript som du postede her og selv løst resten, tak for det. Derfor accepterer jeg også dit indlæg som et svar, så hvis du lige kan "svare"...


Tak for hjælpen, allesammen, det har været lærerigt!


Venlig hilsen
Kim Andersen
Avatar billede ellebaek Nybegynder
19. april 2004 - 20:02 #9
jeg smider da gerne et svar ;-)
Og velbekomme...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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