[PHP] Tabel ontleden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
Beste Tweakers,
Ik probeer in een script een tabel te ontleden.
Ik wil alle rij'en 1 voor 1 in een array genaamt: $rij
Vervolgens wil ik dat die rij eruit 'gesloopt' word en dat ik de rest van de tabel overhoudt in $cutted_table.

Ik heb daarvoor dit bedacht:
PHP:
1
2
3
4
5
6
7
8
9
$rij = array(); $cutted_table = array();
$cutted_table['0'] = $table;
for($i=0; $i<=22; $i++) {
    $aantal = $i+1;
    //Zoekt naar $needle, geeft alles daarvoor terug. (exl. $needle).
    $rij["$aantal"] = rev_strstr($cutted_table["$i"], '</tr>');
    //Zoekt naar $needle, geeft alles daarna terug (inc. $needle).
    $cutted_table["$aantal"] = stristr($cutted_table["$i"], '</tr>');
}


Functie:
PHP:
1
2
3
4
5
6
<?php
//Zoekt naar $needle, geeft alles daarvoor terug. (exl. $needle).
function rev_strstr($haystack,$needle) { 
    $lookfor=explode($needle,$haystack); 
    return $lookfor[0];
}

?>
Mijn probleem is dat ik totaal geen losse rij'en krijg en dat me knip functie ook niet (goed) werkt.
Als ik print_r($cutted_table) doe krijg ik eerst de orginele tabel klopt, 2de de tabel -1 rij klopt, maar de 3->22 krijg ik iedere keer 2de resultaat.

Ik weet niet meer wat ik moet doen, jullie wel?

Ik heb o.a. php.net van onder tot boven uitgekleed maar er nix Werkends tussen kunnen vinden (allerlei functies etc) jullie zijn me laatste hoop :)

[ Voor 7% gewijzigd door Ramasha op 28-01-2006 17:26 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Waarom gebruik je geen regular expressions? Die zijn IMO veel beter geschikt voor dergelijk ontleedwerk.

'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!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Nog een mogelijkheid is om er een DOM object van te maken en er zo mee te doen wat je wilt.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
-NMe- schreef op zaterdag 28 januari 2006 @ 18:21:
Waarom gebruik je geen regular expressions? Die zijn IMO veel beter geschikt voor dergelijk ontleedwerk.
eigenlijk doordat het een variabelle inhoud heeft en je dus niet van te voren kan zeggen zus en zo.

Een dom object had ik idd al, alleen wil ik naar een 'slim' object toe. Ipv van 200/300 regels code's wil ik toe naar een geavanceerde stuk code.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Ramasha schreef op zaterdag 28 januari 2006 @ 21:01:
eigenlijk doordat het een variabelle inhoud heeft en je dus niet van te voren kan zeggen zus en zo.
Dat is juist de reden dat regexps zo geschikt zijn als oplossing. ;)

'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!

  • ATS
  • Registratie: September 2001
  • Laatst online: 18-09 15:14

ATS

Huh? Heb je werkelijk 200-300 regels code nodig voor het manipuleren van je tabel met behulp van DOM? Dan doe je het vast niet zo handig...
Je vraag is trouwens ook niet echt duidelijk. Welke rij wil je er nu uitslopen?

[ Voor 10% gewijzigd door ATS op 28-01-2006 21:07 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
ATS schreef op zaterdag 28 januari 2006 @ 21:07:
Huh? Heb je werkelijk 200-300 regels code nodig voor het manipuleren van je tabel met behulp van DOM? Dan doe je het vast niet zo handig...
Je vraag is trouwens ook niet echt duidelijk. Welke rij wil je er nu uitslopen?
iedere Rij, dus ik wil een array maken waarin iedere rij zit. Verdere verwerking etc heb ik al bedacht alleen loop ik hier dus vast...

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

PHP:
1
2
preg_match_all("#<tr[^>]*>\s*(.*)\s*</tr>#Ui", $table, $matches);
print_r($matches);

Dat zou precies moeten doen wat jij wil. ;)

'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!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Enigszins niet netjes maar exploden op "</tr>" zou ook moeten gaan. Regex is natuurlijk netter.

[ Voor 18% gewijzigd door TheLunatic op 29-01-2006 01:49 ]

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

TheLunatic schreef op zondag 29 januari 2006 @ 01:48:
Enigszins niet netjes maar exploden op "</tr>" zou ook moeten gaan. Regex is natuurlijk netter.
Met simpelweg exploden krijg je in het eerste element van het array alles vanaf het begin van je document tot aan de eerste </tr>, en in het laatste alles vanaf de laatste </tr> tot aan het einde van het document. Als je dus al iets met exploden wil doen, dan zou ik eerder kijken naar preg_split, al zal dat niet beter zijn dan de regexp die ik hierboven al gaf. :)

'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!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
-NMe- schreef op zondag 29 januari 2006 @ 00:06:
PHP:
1
2
preg_match_all("#<tr[^>]*>\s*(.*)\s*</tr>#Ui", $table, $matches);
print_r($matches);

Dat zou precies moeten doen wat jij wil. ;)
Het doet idd wel wat, maar ik krijg iets vreemds.

ik doe met de volgende code:

PHP:
1
2
3
4
5
print_r($matches);

foreach ($matches as $key => $value) {
   echo "Key: $key; Waarde: $value<br>\n";
}


code:
1
2
Array ( [0] => Array ( [0] =>  [1] =>  ) [1] => Array ( [0] =>  [1] =>  ) ) Key: 0; Waarde: Array
Key: 1; Waarde: Array


ik krijg dus een heel diep geneste array. nu zou ik graag willen zien wat er in die array (van waarde) zit.

Acties:
  • 0 Henk 'm!

  • brokenp
  • Registratie: December 2001
  • Nu online
print_r($value)??

Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Of nog beter:
print_r($matches), om je hele array te printen. Wel even
• <pre> </pre> tags er omheen, of
• in de source van je output het resultaat bekijken of
• header("content-type: text/plain") gebruiken
omdat je anders een half onleesbare output krijgt :)

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Dat is toch precies waar ze het dom-model voor hebben uitgevonden? Zodat je door de elementen heen kan lopen met een iterator etc, en daarmee de gegevens eruit kan halen? Of zie ik iets over het hoofd?

Volgens mij werkt dat in ieder geval betrouwbaarder dan zelf met regexes rommelen, aangezien je daarbij afhankelijker wordt van regeleindes enz. De kans op fouten is groter :)

Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
DOM is schijnbaar een term, mmm ok ... ga me daar ook eens in verdiepen.
Iemand die zo tutorials kan opschrijven? ik probeer het zowiezo eventjes via google.

TheLunatic ik ga jouw tip zometeen eventjes proberen. Maar zoals al aangegeven had ik print_r($matches); al geprobeerd.

[ Voor 18% gewijzigd door Ramasha op 29-01-2006 15:44 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

kijk eens op www.php.net/dom :) alles wat je ooit wilde weten en meer over welke functies je kan gebruiken. Het is niet altijd even gebruikersvriendelijk, maar je kan er idioot veel mee. Voor een groot gedeelte komt het overeen met javascript DOM-model: dit is uitgelegd op www.w3schools.com. En mocht je een uitgebreid voorbeeld willen hebben in Javascript (1-op-1 te vertalen naar andere talen volgens mij) moet je eens op mijn site kijken, waar ik wat 'spannende' AJAX-achtige trucjes uithaal. Good luck :)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Ramasha schreef op zondag 29 januari 2006 @ 15:43:
TheLunatic ik ga jouw tip zometeen eventjes proberen. Maar zoals al aangegeven had ik print_r($matches); al geprobeerd.
Dat betekent dat mijn regular expression niet matcht met jouw ingevoerde string, wat weer betekent dat je die aan zou moeten passen. Laat bijvoorbeeld de twee \2* die erin staan eens weg. Of je kan inderdaad naar het DOM kijken.

'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!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Ramasha schreef op zondag 29 januari 2006 @ 11:09:
[...]


Het doet idd wel wat, maar ik krijg iets vreemds.

ik doe met de volgende code:

PHP:
1
2
3
4
5
print_r($matches);

foreach ($matches as $key => $value) {
   echo "Key: $key; Waarde: $value<br>\n";
}


code:
1
2
Array ( [0] => Array ( [0] =>  [1] =>  ) [1] => Array ( [0] =>  [1] =>  ) ) Key: 0; Waarde: Array
Key: 1; Waarde: Array


ik krijg dus een heel diep geneste array. nu zou ik graag willen zien wat er in die array (van waarde) zit.
Volgens php.net is $matches[0] een array met de full-pattern matches en $matches[1] een array met de eerste capture-group van de regular expression.

Om de inhoud van een variabele te zien, gebruik ik trouwens meestal var_dump i.p.v. print_r, al helemaal voor array's.

En in de expressie wil je misschien ook de 's'-modifier gebruiken, zodat de . ook new-lines matched.

Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
MBV schreef op zondag 29 januari 2006 @ 22:44:
kijk eens op www.php.net/dom :) alles wat je ooit wilde weten en meer over welke functies je kan gebruiken. Het is niet altijd even gebruikersvriendelijk, maar je kan er idioot veel mee. Voor een groot gedeelte komt het overeen met javascript DOM-model: dit is uitgelegd op www.w3schools.com. En mocht je een uitgebreid voorbeeld willen hebben in Javascript (1-op-1 te vertalen naar andere talen volgens mij) moet je eens op mijn site kijken, waar ik wat 'spannende' AJAX-achtige trucjes uithaal. Good luck :)
Ok jongens, ik heb wat gelezen over DOM etc.. en ik denk dat de volgende code juist is:

PHP:
1
2
3
4
5
6
7
8
$doc = new DOMDocument();
$doc->loadHTML($stripped_table);

$tags = $doc->getElementsByTagName('tr');

foreach ($tags as $tag) {
       echo $tag->nodeValue."\n";
}


eerst laat hij de gestripte tabel in en vervolgens haal hij 1 voor 1 de tr tags eruit. Zo ook genoemd bij user-comments. Nu mijn prob.

code:
1
2
3
Warning: domdocument() expects at least 1 parameter, 0 given in /home/gevondenspullen.nl/www/beursdeals.nl/bot.php on line 22

Fatal error: Call to undefined function: loadhtml() in /home/gevondenspullen.nl/www/beursdeals.nl/bot.php on line 23


Terwijl mijn host toch egt PHP5 draait. en de warning vind ik ook vreemd. Ik heb proberen te zoeken op php.net naar domdocument() etc maar er staat niets over deze functie.

Iemand die meer verstand heeft van DOM die me uit de brand kan helpen?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:18

crisp

Devver

Pixelated

Even terugkomend op het regular expression verhaal: end-tags voor het TR-element zijn in HTML optional - wellicht iets om rekening mee te houden ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Die fout heeft niets te maken met het DOM, maar met het feit dat jij de foutmelding niet goed doorleest. Blijkbaar verwacht die constructor van het DOMDocument tenminste één parameter, en jij geeft die niet. Daarom wordt het object niet fatsoenlijk gemaakt, en kun jij dus niet werken met de LoadHTML-functie. Lees dit nog eens goed door. Als je goed kijkt zie je daar een tweede methode om het aan te pakken zonder constructor.

'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!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
-NMe- schreef op maandag 30 januari 2006 @ 16:46:
Die fout heeft niets te maken met het DOM, maar met het feit dat jij de foutmelding niet goed doorleest. Blijkbaar verwacht die constructor van het DOMDocument tenminste één parameter, en jij geeft die niet. Daarom wordt het object niet fatsoenlijk gemaakt, en kun jij dus niet werken met de LoadHTML-functie. Lees dit nog eens goed door. Als je goed kijkt zie je daar een tweede methode om het aan te pakken zonder constructor.
Jahwel ik heb de foutmelding goed doorgelezen en kwam tot dezelfde conclusie. Alleen zoals ik al vermelde kon ik daarover niets vinden... ik ga weer eventjes kijken :)

IIG hartelijk bedankt tot dusver, en uiteraard voor de snelle reactie's

Gaat dus niet helemaal zo soepel als ik dacht, aangezien ik moest wachten totdat een aantal settings gechanged waren die ik gister aan heb gevraagd. Alleen krijg ik nu de error Fatal error: Call to undefined function: loadhtml() in /home/gevondenspullen.nl/www/beursdeals.nl/bot.php on line 22 mij dunkt me dat DOM of niet in 5.0 zit of dat hij de functies niet goed pakt.
Op php.net staat ook niets over versie nummer waaronder het zou werken, alleen dathet de opvolger zou zijn van PHP 4. Het zou dus moeten werken.

PHP:
1
2
3
4
5
$doc = DOMDocument::loadHTML($stripped_table);
$tags = $doc->getElementsByTagName('tr');
foreach ($tags as $tag) {
       echo $tag->nodeValue."\n";
}

[ Voor 40% gewijzigd door Ramasha op 30-01-2006 18:48 ]


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
DOMDocument->loadHTML

(no version information, might be only in CVS)

M.a.w., dit is nog geen onderdeel van een gereleasde php versie. Werkt alleen als je php download van cvs en zelf compileerd.

[ Voor 46% gewijzigd door stekkel op 30-01-2006 20:17 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

lijkt mij dus dat je de HTML-code in een string moet laden en vervolgens daarmee verder spelen in domdocument. Als je erg eigenwijs ben kan je overstappen naar Perl, die kan het wel :P ;)
Pagina: 1