[PHP] open HTML tags omzeilen

Pagina: 1
Acties:
  • 224 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Ik zoek een oplossing voor het volgende probleem; voor de hoofdpagina van een website wil ik een overzichtje maken van nieuws berichten. Omdat het niet de bedoeling is dat het hele bericht daar komt te staan gebruik ik substr() om de boel na een aantal karakters af te kappen. Nu werkt dat prima, totdat je per ongeluk afkapt op een punt waar nog een tag openstond; dan is je xhtml ineens niet meer valid, en dat was wel de bedoeling.
Ik zoek dus een oplossing voor dit probleem. Andere tags dan opmaak tags als i,b,u,p etc. zijn niet toegestaan. Wat is de beste manier om dit probleem te tackelen? Heb al gedacht aan een regex, maar ben daar niet zo'n held in, dus dat lukt me niet. Andere oplossingen heb ik (nog) niet, dus vandaar dat ik jullie even om advies vraag O-)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je kan tags inlezen in een array (d.m.v. tokenizen), en weer verwijderen na de (juiste) sluit-tag. Op het eind kijk je welke tags er nog in het array staan, en die sluit je dan netjes af. :)

[ Voor 6% gewijzigd door NMe op 12-09-2004 14:24 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Gewoon alle tags weghalen? Of hebben ze op je frontpage ook een toegevoegde waarde?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Op hoofdpagina gewoon alle tags weglaten, anders kan iemand ook nog eens per ongeluk een image of iets in de richting in je hoofdpagina douwen.

Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Weglaten is geen optie.. ten eerste zijn het geen HTML tags, maar eigen gedefinieerde tags die omgezet worden naar html. Die tags wil ik toestaan om kleine opmaak zaken toe te laten. Zullen toch geen mensen toegang tot het CMS krijgen die daar niet horen.

Dat tokenizen klinkt als een redelijk simpel en goed idee, zal er eens mee gaan prullen. Vandaag geen tijd meer, maar als ik nog tot een oplossing kom (vast wel) post ik m hier nogwel.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Gewoon alle tags niet als losse tekens tellen, en dan bij je substr commando gewoon het aantal "echte" tekens + tag-tekens substringen. Alhoewel ik denk dat het makkelijkste is om gewoon alle tags ervanaf te strippen.

Want hoe ga je om met met een tekst die totaal bold is, 10.000 tekens lang is???

Ik ga er wel vanuit dat je maar iets van 1 titel + 3 regels van een tekst op je frontpage laat zien, waardoor het effect van de tags in die 3 regels totaal niet boeiend meer is voor je frontpage. Als ze het artikel openen zien ze wel alle tags etc.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gomez12 schreef op 12 september 2004 @ 15:23:
Gewoon alle tags niet als losse tekens tellen, en dan bij je substr commando gewoon het aantal "echte" tekens + tag-tekens substringen.
Lekker lastige constructie bedenk je hier. Tokenizen is veel handiger.
Gomez12 schreef op 12 september 2004 @ 15:23:
Alhoewel ik denk dat het makkelijkste is om gewoon alle tags ervanaf te strippen.

Want hoe ga je om met met een tekst die totaal bold is, 10.000 tekens lang is???

Ik ga er wel vanuit dat je maar iets van 1 titel + 3 regels van een tekst op je frontpage laat zien, waardoor het effect van de tags in die 3 regels totaal niet boeiend meer is voor je frontpage. Als ze het artikel openen zien ze wel alle tags etc.
Waarom zaag je toch door over het weglaten van die tags? Topicstarter geeft aan dat hij ze erin wil laten, dus blijven ze erin. Dat jij dat niet zou doen is niet relevant. Bovendien is het zonder probleem op te lossen... :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Als je PHP5 gebruikt: het HTML-bestand inlezen als DOM (DomDocument->loadHTMLFile heet die geloof ik) en dan daarmee 'netjes' afkappen :)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
$docTree = preg_split("|(</?[a-z]+ ?.*?/?>)|i", $sloppyHTML, -1, PREG_SPLIT_DELIM_CAPTURE);

Ik was bezig met een HTML-Beautifier, bijna af, maar misschien heb je iets aan deze regel.
Je hebt nu een array met daarin de tags en de textNodes, en je kunt text-nodes zo gewoon inkorten.
Note:
Wel even rekening houden met tags die geen sluittag hebben (in HTML 4):
br, hr, img, link, meta, col, nog een paar.

[ Voor 21% gewijzigd door Skaah op 12-09-2004 15:36 ]


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Die is inderdaad wel bruikbaar, alleen wil ik 'm even zo ombouwen dat tags die meteen gesloten worden niet apart genomen worden. Die mogen meteen opgenomen worden, aangezien daar gaan probleem gaat ontstaan... workin' on it!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Skaah schreef op 12 september 2004 @ 15:35:
Wel even rekening houden met tags die geen sluittag hebben (in HTML 4):
br, hr, img, link, meta, col, nog een paar.
Gelukkig heeft hij het over XHTML en hoeft hij hier dus geen aparte cases voor in te bouwen. De tags die je noemt dienen dan te eindigen met een />, en dat is natuurlijk vrij makkelijk te controleren :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

iCe01 schreef op 13 september 2004 @ 11:41:
Die is inderdaad wel bruikbaar, alleen wil ik 'm even zo ombouwen dat tags die meteen gesloten worden niet apart genomen worden. Die mogen meteen opgenomen worden, aangezien daar gaan probleem gaat ontstaan... workin' on it!
Wat was er trouwens mis met het tokenizen? Ik heb (toevallig) 10 minuten geleden nog zoiets gemaakt hier, wel in omnimark, maar het enige echte verschil is dat ze arrays hier shelves noemen...

Ik kan je mn slordige omnimark code wel laten zien, maar zo lastig is het eigenlijk niet...


Edit:
Ik zie dat je al iets gevonden hebt, ik wilde net de omnimark posten, maar aangezien in mn omnimark een foutje zit dat ik er in omnimark zelf makkelijker uit haal dan dat in php zou zijn lijkt het me nu niet handig meer om het te posten

[ Voor 20% gewijzigd door RwD op 14-09-2004 09:16 ]


Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

MisterData schreef op 12 september 2004 @ 15:35:
Als je PHP5 gebruikt: het HTML-bestand inlezen als DOM (DomDocument->loadHTMLFile heet die geloof ik) en dan daarmee 'netjes' afkappen :)
Volgens mij is het gewoon nog makkelijker om het door een xml-parser heen te halen: xhtml is zowiezo xml formatted html, dus als de xml parser het niet pikt staat er iets verkeerds in de xhtml. ;)

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Banpei schreef op 13 september 2004 @ 14:59:
[...]

Volgens mij is het gewoon nog makkelijker om het door een xml-parser heen te halen: xhtml is zowiezo xml formatted html, dus als de xml parser het niet pikt staat er iets verkeerds in de xhtml. ;)
Nouja als je HTML 4 support dan is het wel handig :) En in feite is het een XML-parser (loadXML ipv loadHTML) met het verschil dat loadHTML een paar aanpassingen heeft om ongesloten tags te accepteren :)

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

MisterData schreef op 13 september 2004 @ 15:05:
Nouja als je HTML 4 support dan is het wel handig :) En in feite is het een XML-parser (loadXML ipv loadHTML) met het verschil dat loadHTML een paar aanpassingen heeft om ongesloten tags te accepteren :)
Aja, dan werkt dat idd wel een stukje beter. :)

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Dat is nou juist het hele probleem :) Die string wordt omgezet naar een DomXML boompje, en dat include ik weer in m'n "hoofd"-boom. Maar als het geen fatsoenlijke HTML is werkt dat uiteraard niet, omdat ie de omzetting naar XML boom niet wil maken.

Met tokenizen was niks mis, ik laat gewoon de opties open... als je die code even kunt posten; graag :)

[ Voor 4% gewijzigd door jsiegmund op 13-09-2004 16:23 ]


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Dit is het tot nu toe geworden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Function shortenHTMLMessage ($message,$length) 
{
    // **** INITs
    $tags = array();            // HTML-tags bijhouden
    $echoLen = 0;               // bijhouden hoeveel karakters er al verwerkt zijn
    $newMessage = "";           // het te returnen bericht

    // **** Functie code

    // tekst splitten op HTML-tags
    $htmlTree = preg_split("|(</?[a-z]+ ?.*?/?>)|i", $message, -1, PREG_SPLIT_DELIM_CAPTURE);
    $htmlTree = array_filter($htmlTree);                    // lege entries verwijderen

    foreach($htmlTree as $element) 
    {
        // Controleren of de juiste lengte reeds bereikt is 
        $echoLen += strlen($element);
        if ($echoLen > $length) {                   // juiste lengte, afkappen
            $tags = array_reverse($tags);           // tag moeten in omgekeerde volgorde gesloten worden
            foreach ($tags as $tag)                 
                $newMessage .= "</$tag>";
            $newMessage .= "...";                   // bericht afgebroken; '...' extra echo
            break;                                  // loop voortijdig afbreken
        }

        // Checken op nieuwe tag, mag niet zelfsluitend zijn!
        if (preg_match("|(<[a-z]+ ?.*?>)|i",$element) && !(preg_match("|(<[a-z]+ ?.*?/>)|i",$element)))
        {
            $spacePos = strpos($element," ");           // positie van eerste spatie opzoeken om tagname te bepalen

            if ($spacePos)  $local = substr($element,1,$spacePos);          // tagname bepalen (met spatie)
            else            $local = substr($element,1,strlen($element)-2); // geen spatie, tagname bepalen

            $tags[] = $local;                       // tagname toevoegen aan tags-array
        }
        // Tags die gesloten worden weer netjes uit het array verwijderen
        else if (preg_match("|(</[a-z]+ ?.*?>)|i",$element))
        {
            // bevatten nooit attributen; dus in 1 keer de tagnaam bepalen en verwijderen
            $local = substr($element,2,strlen($element)-3);
            unset ($tags[array_search($local, $tags)]); 
        }

        $newMessage .= $element;        // huidig element toevoegen aan het nieuwe bericht
    }
    
    return $newMessage;
}


En aangezien dat goed werkt laat ik het hier even bij, alhoewel ik sterk het idee heb dat dit makkelijker moet kunnen... maar goed :)
Pagina: 1