[PHP] HTML parsen deel 4827201

Pagina: 1
Acties:

Onderwerpen


  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Hoi,

Tijdje geleden ook al berichtje geplaatst hier of iemand een truuk wist om mbv Tidy een HTML element te bewerken. Omdat daar geen replies opkwamen neem ik aan dat dat lastig is. Ik wou zelf als backup optie met SimpleXML werken, maar helaas blijkt dit niet mogelijk omdat er niet altijd sprake is van valide XML.

Weet er iemand een truuk om het volgende te bereiken middels PHP (regex/tidy/wat dan ook):

- Ik wil alle <b> tags die in de body staan vervangen door <h2> tags. Dit geldt alleen voor de <b> tags die direct in de body staan. <b> tags die bijv in een tabel in de body staan moeten ongewijzigd blijven.

Alvast bedankt!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Je zou eenvoudig door de html heen kunnen lopen en bijvoorbeeld een replace-mode boolean bijhouden. In het begin is deze false. Als je <body bent tegenkomt zet je deze op true. bij <table weer op false en bij </table> weer op true etc. Als je <b> tegenkomt vervang je dit in <h2> alleen als de replace-mode true is.

Dit werkt niet als je geneste tabellen hebt. Dan kun je een eenvoudig tellertje bijhouden, iedere keer <table verhoog je de teller met 1, iedere keer </table> verlaag je deze. Je vervangt alleen als deze 0 is.

Wil je nog meer uitsluiten dan alleen tabellen, dan kun je eventueel meerdere tellertjes gebruiken of een stack.

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Dat kan eenvoudig met PHP Simple HTML DOM Parser

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Bedankt, eindelijk feedback :) Ik snap je plan, maar de table was slechts een voorbeeld: Het geldt voor alle elementen. Dat betekent niet alleen jouw loopje een heleboel keer doen, maar ook bijhouden wanneer een tag weer gesloten wordt... lijkt me nogal omslachtig? Ik richt nu mijn pijlen op PHP's DOMDocument, in principe voel ik aan mijn water dat ik het daar zou moeten zoeken, maar krijg het niet lekker aan de praat.

Het stomme is dat ik altijd een hekel had aan js, maar nu besef dat ik deze klus in js in vijf minuten zou klaren...
Iemand ervaring met DOMDocument die me kan verklappen hoe ik het js-equivalent van ChildNodes aanroep?

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Je kan gewoon childNodes gebruiken, als je een beetje bekend bent met Javascript dan moet het geen probleem zijn.

Er staan diverse voorbeelden op http://php.net/manual/en/book.dom.php

[ Voor 36% gewijzigd door Johnny op 14-11-2008 00:20 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Volgens mij is htmlpurifier wel iets voor jou :)

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Bedankt mensen, hier kom ik verder mee! Htmlpurifier heb ik wel eens van gehoord, zal me erin verdiepen. Klinkt als een hemels geschenk voor elke standaardfetishist en codenazi zoals ik :)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Voorbeeldje, aangezien ik ze niet erg kan vinden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$content = '<body><b class="title" id="t1">titel <i>1</i>a</b>'.
           '<p><b>inhoud</b></p><b>titel 2</b></body>';

$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
$elements = $xpath->query('body/b');

for($i = $elements->length - 1; $i >= 0; $i--) {
    $old = $elements->item($i);
    $new = $doc->createElement('h1');
    foreach($old->attributes as $attr) {
        $new->setAttributeNode($attr);
    }
    $children = $old->childNodes;
    while($children->length > 0) {
        $new->appendChild($children->item(0));
    }
    $old->parentNode->replaceChild($new, $old);
}

echo $doc->saveHTML();

Helaas kun je volgens mij niet direct de tagName veranderen (readonly).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

xilent_xage schreef op donderdag 13 november 2008 @ 23:37:
Hoi,

Tijdje geleden ook al berichtje geplaatst hier of iemand een truuk wist om mbv Tidy een HTML element te bewerken. Omdat daar geen replies opkwamen neem ik aan dat dat lastig is. Ik wou zelf als backup optie met SimpleXML werken, maar helaas blijkt dit niet mogelijk omdat er niet altijd sprake is van valide XML.

Weet er iemand een truuk om het volgende te bereiken middels PHP (regex/tidy/wat dan ook):

- Ik wil alle <b> tags die in de body staan vervangen door <h2> tags. Dit geldt alleen voor de <b> tags die direct in de body staan. <b> tags die bijv in een tabel in de body staan moeten ongewijzigd blijven.

Alvast bedankt!
En wat heb je zelf al geprobeerd en wat lukte daar dan precies niet mee? Een vraag stellen is prima maar we zien graag ook wat eigen inzet terug en dat zien we nu helemaal niet terug in je topicstart.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1