Avatar billede azzodiac Nybegynder
28. maj 2004 - 15:12 Der er 19 kommentarer og
1 løsning

Replace tekst imellem HTML tags

Hejsa.

Jeg har en streng: "<html><img src="" alt="xxx" /><p>xxx</p><div>xxx</div></html>"

Hvori jeg gerne vil erstatte "xxx" med "<span>xxx</span>", men vel at mærke kun de steder hvor "xxx" optræder imellem HTML-tags. Dvs. at den skal ikke erstatte "xxx" i billed-tag'en.

Håber nogen kan hjælpe.
Avatar billede roenving Novice
28. maj 2004 - 15:41 #1
txt = '<html><img src="" alt="xxx" /><p>xxx</p><div>xxx</div></html>'
txt = txt.replace(/(>[^<]+)/g,'><span$1</span>');
Avatar billede azzodiac Nybegynder
28. maj 2004 - 17:57 #2
Jeg skriver det i ASP, men må indrømme at jeg ikke har brugt regular expressions i ASP før. Kan du hjælpe mig med hvordan det skal implementeres?
Jeg har prøvet følgende:

Function StripHTML(ByRef asHTML)
    Set regEx = New RegExp
    regEx.IgnoreCase = True
    regEx.Global = True
    regEx.Pattern = "/(>[^<]+)/g,'><span$1</span>'"
    StripHTML = regEx.Replace(asHTML, asHTML)
    Set regEx = Nothing
End Function

txt = "<html>tekst<img src="""" alt=""tekst"" />tekst</html>"

txt = StripHTML(txt)
Avatar billede roenving Novice
28. maj 2004 - 18:03 #3
Har ingen forstand på RegExps i VBscript, men jeg vil gætte på sådan:

    regEx.Pattern = "(>[^<]+)"
    StripHTML = regEx.Replace(asHTML, "><span$1</span>")

-- og hvis du nu bare havde brugt Jscript i stedet, kunne du jo have brugt min udgave !o]

Active Server Pages har ikke det fjerneste med et programmeringssprog at gøre, men er en arkitektur, hvori server-side programmering kan afvikles i en række programmeringssprog, deriblandt VBscript og f.eks. Jscript (M$ javascript !-)
Avatar billede azzodiac Nybegynder
28. maj 2004 - 18:12 #4
Du er jo sindsyg. ;-)
Læg bare et svar. Tak for hjælpen.
Avatar billede roenving Novice
28. maj 2004 - 18:16 #5
Det virkede altså ?-)

-- velbekomme '-)
Avatar billede azzodiac Nybegynder
28. maj 2004 - 18:16 #6
Hov, udtrykket tilføjer <span> ved alt tekst som optræder i teksten. Det skal kun være de steder hvor lige præcis strengen "xxx" optræder.
Håber du gider prøve igen.
Avatar billede azzodiac Nybegynder
28. maj 2004 - 18:18 #7
Ja, det virkede. Men hvis strengen f.eks. ser sådan ud:

txt = '<html><img src="" alt="xxx" /><p>xxx</p><div>yyy</div></html>'

er det kun det sted hvor der står "xxx" imellem HTML tags, som skal replaces.
Avatar billede roenving Novice
28. maj 2004 - 18:18 #8
regEx.Pattern = "(xxx)"
    StripHTML = regEx.Replace(asHTML, "<span>$1</span>")
Avatar billede roenving Novice
28. maj 2004 - 18:19 #9
Hov, vi skal jo sikre, at det er noget, som står efter et tag:
    regEx.Pattern = "(>xxx)"
    StripHTML = regEx.Replace(asHTML, "><span$1</span>")
Avatar billede azzodiac Nybegynder
28. maj 2004 - 18:26 #10
Der var den fanme. Tak skal du have.
Avatar billede roenving Novice
28. maj 2004 - 18:34 #11
-- og tak for point ;~}
Avatar billede azzodiac Nybegynder
28. maj 2004 - 18:45 #12
Jeg opdagede lige en ting mere. Håber du gider hjælpe med det.
Hvis strengen f.eks. hedder

txt = '<html><img src="" alt="xxx" /><p>zzzxxx</p><div>yyy</div></html>'

Altså hvor "xxx" ikke står lige før et større-end tegn, fanger den den ikke.
Avatar billede roenving Novice
28. maj 2004 - 18:53 #13
Næh, men et eller andet skal vi have til at skelne mellem at det står inde i et tag og udenfor, det kan vel også være, at der hverken foran eller bagved er et start- eller slut-tag ...

Det lyder som om, det så ikke er en regexp, men en langsom streng-behandling der skal til ...

Hrm ...

Måske kan man godt finde på noget ...
Avatar billede azzodiac Nybegynder
28. maj 2004 - 19:11 #14
Jeg vil godt give dig 60 yderligere point, hvis du kan hjælpe mig med det.

Jeg må hellere forklare problemstillingen:

Alle tilfælde af strengen "xxx" skal erstattes af "<span>xxx</span>", undtagen de steder, hvor strengen er inde i < og >.

Dvs.
"<img src="qwe" alt="xxx" />" skal ikke erstattes
men f.eks.
"<div><b>yxxxz</b></div>" skal erstattes.
Avatar billede roenving Novice
28. maj 2004 - 19:42 #15
Hrm ...

Ser umiddelbart ud til at virke, men du må nok lige stress-teste den:

    regEx.Pattern = "(>[^xxx|^<]*)xxx([^<]*)"
    StripHTML = regEx.Replace(asHTML, "$1<span>xxx</span>$2")
Avatar billede azzodiac Nybegynder
29. maj 2004 - 10:51 #16
Den er tæt på. :-)

Hvis strengen ser f.eks. sådan ud:

txt = "<html><p>tekstxxxtest xxx testxxx</p></html>"

er det kun den første forekomst af "xxx" som replaces.
Avatar billede roenving Novice
29. maj 2004 - 11:53 #17
Og den tror jeg ikke vi kan finde en algoritme på, hvis vi samtidig skal udelukke det, som er inde i tags ...

Så bliver det på den langsomme måde, hvor man skal splitte teksten først, kun køre regexp overfor de dele, som er imellem tags og så samle igen !-)
Avatar billede azzodiac Nybegynder
29. maj 2004 - 11:59 #18
Hmm ja, jeg kan godt se hvad du mener.

Gider du prøve at udforme noget pseudokode, som jeg selv kan arbejde videre med? Så skal du nok få de 60 ekstra point.
Avatar billede roenving Novice
29. maj 2004 - 12:53 #19
Hvis det var javascript, ville det blive med en par .splits, men jeg ved ikke om VB har noget tilsvarende ...

txt = txt.split(">");//opdel strengen ved tag-slut, læg resultatet i et array
for(i=0;txt.length>i;i++){
  txt[i] = txt[i].split("<");//opdel strengen i to dele ved tag-start
  txt[i][0] = txt[i][0].replace(/xxx/g,"<span>xxx</span>");//udfør replace overfor den første del
  txt[i] = txt[i].join("<");//læg strengen sammen igen
}
txt = txt.join(">");//læg strengen sammen igen
Avatar billede azzodiac Nybegynder
29. maj 2004 - 13:21 #20
Jeps, det spiller med JScript fortolkeren.

<% @Language=JScript %>
<%
txt = "<html>tekst<img src=\"\" alt=\"xxx\" />xxxtest xxx testxxx<a href=\"xxxwerxxxcx.xxx\">testigen</a></html>"

txt = txt.split(">");//opdel strengen ved tag-slut, læg resultatet i et array
for(i=0;txt.length>i;i++){
  txt[i] = txt[i].split("<");//opdel strengen i to dele ved tag-start
  txt[i][0] = txt[i][0].replace(/xxx/g,"<span>xxx</span>");//udfør replace overfor den første del
  txt[i] = txt[i].join("<");//læg strengen sammen igen
}
txt = txt.join(">");//læg strengen sammen igen

Response.Write(txt);
%>

Jeg prøver at oversætte det til VBScript senere, men det her virker i hvertfald.
Jeg opretter et nyt spørgsmål, hvor du kan få de ekstra 60 point.
Tak for hjælpen.
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