Regex, match onvolledige html tags

  • Hallo iedereen,


    Ik ben momenteel wat aan het programmeren en ik heb deze situatie voor:
    Ik heb een blok html die wordt afgekort door de substr() functie.
    Het betreft hier het begin van een artikel met erna een "lees meer" knop.


    Nu kan dat artikel natuurlijk html codes bevatten, e.g. de strong-tag. Hier kan de substr() functie aardig de html verpesten.
    Ik heb al een functie die alle geopende tags ook weer sluit.
    Maar nu zit ik nog met het volgende scenario, de substr() functie kan halve tags verwijderen.
    Bijvoorbeeld:


    HTML
    <strong>
    Hallo allemaal
    </strong>
    <stro

    En dus wil ik met een regex de tags die niet volledig zijn eruit halen.
    Ik heb momenteel de volgende regex

    Diff
    /(<.*)(?!>)/


    Maar deze doet het helaas niet... Wie zou mij kunnen helpen? Ik geraak er zelf echt niet uit.
    Hij zou dus moeten matchen met de onvolledige tag in de onderstaande voorbeelden:


    Diff
    Woordje <e
    <a href=
    <strong>qsdf</strong> <str

    Het probleem is nu dat hij ook volledige tags matcht. Bv. bij de laatste regel matcht hij de volledige regel aan.


    Alvast bedankt!


    Willem

  • Meestal grijp je pas naar een regexp als alle eenvoudigere oplossingen zijn uitgeput. Vaak bestaan er goedkopere string-functies die precies/ongeveer doen waar je naar zoekt.


    Ik denk dat dit vraagstuk eenvoudig(er) opgelost kan worden door gewoon te kijken waar de laatste voorkomens van > en < zich bevinden met behulp van strrpos().


    Indien de laatste < na de laatste > valt (wellicht zul je nog andere randgevallen moeten controleren) wil dit zeggen dat je een niet-gesloten tag hebt. Je kunt dan de positie van de laatste < pakken.


    Let erop dat strlen() bytes telt, en geen karakters. Het is waarschijnlijk beter om string-bewerkingen met mb-functies te doen. In dat opzicht is het dus ook verstandiger om mb_strrpos() te gebruiken in plaats van strrpos().

  • Een alternatief is bijvoorbeeld dat je een inleidende alinea in een apart veld opslaat, of deze paragraaf een speciale class meegeeft (zodat deze ook dikgedrukt wordt, als een soort samenvatting, dit zie je ook geregeld in kranten). Bij laatstgenoemde methode zou je alles in één veld kunnen opslaan, en die eerste paragraaf uit de tekst kunnen hengelen met een regexp.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!