15. maj 2008 - 15:15Der 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."
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?
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.
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.
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 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.
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> ...
Synes godt om
Ny brugerNybegynder
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.