Avatar billede zurekk Nybegynder
15. maj 2008 - 15:15 Der er 8 kommentarer og
1 løsning

Look-behind problem.

Hej Eksperter,

Jeg har til opgave, at lave et script som fanger og fjerner halve html-tags. Mit problem er så bare, at RegEx ikke tillader RegEx inde i look-behinds.

Jeg havde tænkt mig noget ala:
#(?<!<(\w+)>.*?)</\1>#is (simpel udgave)

Men som I kan se, vil det ikke virke. Så er der andre måder at gøre det på?

Det den skal gøre er at fjerne tags som disse:
"Lille Lise gik sig en <strong>tur."
"Lille Lise gik</strong> sig en tur."
"Lille </strong> Lise gik sig <strong>en tur."

På forhånd tak!
Avatar billede nielle Nybegynder
15. maj 2008 - 15:43 #1
Det er nu specifikt PHP's variant af regsxp som ikke tillader regexp af *varierende* længde i en look-behind. Havde regexp'en været af fast længde (altså uden .*), ville PHP have accepteret den. Andre programmerings-sprog har ikke denne mangel i deres regexp-variant - man man f.eks. godt gøre det i .NET.

Du giver nogle eksempler på tags der skal fjernes - imidlertid er det de relativt pæne eksempler. Hvad skal der f.eks. fjernes her?

abc <strong>def</strong>ghi</strong> jkl
abc <strong>def<strong>ghi</strong>jkl</strong> mno

Jeg mener imidlertid ikke at opgaven er specielt velegnet til at blive løst lige med regexp. Du kan måske bruge regexp til at finde selve tags'ene, men optælling af start- og slut-tags er nok bedre gjort i almindelig PHP kode.
Avatar billede zurekk Nybegynder
15. maj 2008 - 15:53 #2
Hej Nielle,

Dit andet eksempel løses allerede i mit script. På eksempel et, er det ligegyldigt hvilken close-tag den fjerner, så længe kun tags der åbnes og lukkes(<strong>...</strong>), bliver tilbage.
Avatar billede nielle Nybegynder
15. maj 2008 - 17:33 #3
Det er da vel ikke totalt ligegyldigt hvordan resultatet ser ud bagefter? Så kunne du jo bare slette samtlige tags.
Avatar billede zurekk Nybegynder
15. maj 2008 - 17:42 #4
Nej. Det er ligegyldigt hvilken closing-tag der fjernes. Hvis der findes et open-tag, og to closing-tags. Altså som i "abc <strong>def</strong>ghi</strong> jkl". Er det umuligt at fjerne den sidste, så fjern bare den første. Så længe der kun er "<strong>....</strong>" tilbage.

Det der er lettest :)
Avatar billede nielle Nybegynder
15. maj 2008 - 18:09 #5
Det er vel ikke et spørgsmål om hvad der er lettest, men om hvad der er mest korrekt.

Det er f.eks. ikke lige korrekt HTML-kode der kommer ud af om du sletter den eller eller dan anden her:

a <div> b <strong> c </strong> d </div> e </strong> f

Men som sagt mener jeg ikke at det er en opgave der passer specielt som fod-i-hose til regexp.
Avatar billede zurekk Nybegynder
15. maj 2008 - 18:22 #6
Det er muligt, at den bedste løsning ville være en blanding af både regexp og php. Men lige pt. er det noget jeg gerne vil ordne med regexp. Kan du hjælpe mig med det?

Og ja, det er rigtigt, at det ville være smartest at fjerne den sidste, det ville jeg også foretrække. Men uanset om du fjerner den første, eller anden, vil det blive ordnet i mit script senere hen. Det er ikke sådan at jeg kører min tekst igennem det script, som du forhåbentlig kan hjælpe mig med, og så skulle det være fixet. Der ligger meget mere bag det, som jeg dog selv står for.

Det jeg skal bruge, er bare et script, som finder closing-tags, som ikke er blevet startet. Derfor skulle: "Lille <strong>Lise</strong> gik sig</strong> en tur.", gerne ende med at se således ud: "Lille <strong>Lise</strong> gik sig en tur.".

Jeg håber, at det er noget som du kan hjælpe mig med.
Avatar billede zurekk Nybegynder
16. maj 2008 - 12:10 #7
Jeg giver tråden et par timer, og så lukker jeg :-)
Avatar billede zurekk Nybegynder
16. maj 2008 - 23:17 #8
Okay then..
Avatar billede nielle Nybegynder
17. maj 2008 - 09:07 #9
Ok, en smule utålmodig?

Nej, jeg tror faktisk ikke at denne bare kan klares med regexp og intet andet.

En mulig løsning kunne være at matche alle tags med en tilsvarende slut-tag:

... <tag attr="42"> ... <tag> ... </tag> ...
... *************** ... <tag> ... ****** ...

og ændre dem midlertidigt sådan at de ikke er tags mere - f.eks. til:

... [tag attr="42"] ... <tag> ... [/tag] ...

Fortsæt med dette til at der ikke mere er nogen tags som kan "fjernes". Slet så de tags der er tilbage:

... [tag attr="42"] ...  ... [/tag] ...

- og ret derefeter tilbage til rigtige tags:

... <tag attr="42"> ...  ... </tag> ...
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