[ dr ZiDoo @ 10.09.2005. 17:52 ] @
Imam jedan problem i već 5 dana se patim :)=

HTML fajl:
Code:

...
<body>
 <table width="100%" cellspacing="1" cellpadding="1">
  ...
 </table>

 <table width="150" cellspacing="1" cellpadding="1">
  ...
 </table>

 ...

 <table width="150" cellspacing="1" cellpadding="1">
  ...
 </table>
...
</body<


E sada ka trenbam da pokupim sadržaj svih tabela koje imaju dužinu 150px ili ti svih tabela koje počinju: "<table width="150" cellspacing="1" cellpadding="1">".

Pokušo sam na milion načina i nijedan mi nije uspio, jednostavno uvjek ne dobijem dobar rezultat. Imali neki regexp guru, pošto meni očito ne ide...





[Ovu poruku je menjao dr ZiDoo dana 10.09.2005. u 18:53 GMT+1]
[ noviKorisnik @ 10.09.2005. 18:11 ] @
Mislio si širinu 150px?

Problem mogu da ti prave ugnježdene tabele (koliko znam, to obično tako ide, tabela u tabeli dok ne dosadi).

Probaću da se poigram, dok ne naiđe neki pravi guru...
[ noviKorisnik @ 10.09.2005. 18:34 ] @
Evo nešto što će naravno da pukne na ugnježđenim tabelama... za početak
Code:
<?php
header ('Content-type: text/plain');
$filename = 'withtable.html';
$filecontent = file_get_contents ($filename);
$pattern = "/<table\b(.|\n)*\bwidth=\"150\"(.|\n)*>(.|\n)*<\/table>/";
preg_match_all ($pattern, $filecontent, $result);
print_r ($result);
?>
[ noviKorisnik @ 10.09.2005. 18:51 ] @
Još gore, ulovi sve do poslednjeg "</table>" :-(
[ dr ZiDoo @ 10.09.2005. 21:44 ] @
Tak nesto slicno i ja dobijem... tj. dobio sam sve moguce kombinacije osim one prave :(
[ japan @ 10.09.2005. 21:56 ] @
Citat:
noviKorisnik: Još gore, ulovi sve do poslednjeg "</table>" :-(


možda ovo pomogne:
Citat:

By default, the quantifiers are "greedy", that is, they
match as much as possible (up to the maximum number of per-
mitted times), without causing the rest of the pattern to
fail. The classic example of where this gives problems is in
trying to match comments in C programs. These appear between
the sequences /* and */ and within the sequence, individual
* and / characters may appear. An attempt to match C com-
ments by applying the pattern

/\*.*\*/

to the string

/* first command */ not comment /* second comment */

fails, because it matches the entire string due to the
greediness of the .* item.

However, if a quantifier is followed by a question mark,
then it ceases to be greedy, and instead matches the minimum
number of times possible, so the pattern

/\*.*?\*/

[ flylord @ 10.09.2005. 22:12 ] @
Moglo bi da pomogne da parsiras taj html preko xml-dom f-ja ... Pre toga odradi validaciju HTML-a preko html tidy-a. A onda preko dom-a mozes da pristupis svakom elementu
[ cabrilo @ 12.09.2005. 22:39 ] @
Evo ti ga algoritam... Nece raditi ako imas jos neku tabelu u zeljenoj tabeli (tj. prekinuce se na prvom </table> posle pocetka citanja):

Code:

<?php
// Prvo ucitas celu stranu u $buffer
$buffer = file ("fajl");

// Gde da pocne da cita, gde da prekine
$startcode = "<table width=\"150\" cellspacing=\"1\" cellpadding=\"1\">";
$endcode = "</table>";

$entries = array ();
$counter = -1;
$read = FALSE;

// Cita samo kada je vec pronadjen pocetak, a nije pronadjen kraj. 
foreach ($buffer as $line) {
    if (strstr ($line, $endcode))
        $read = FALSE;
    if ($read)
        $entries[$counter] .= $line;    
    if (strstr ($line, $startcode)) {
           $read = TRUE;    
        $counter++;
    }
}
?>


Posle ovoga, sve ce ti se nalaziti u arrayu $entries... Dakle $entries[0] je iz prve tabele, $entries[1] iz druge itd.

Sad, ako bi zeleo da radi sa nested tabelama, trebalo bi da uradis proveru da li je otvoren jos jedan <table> kada je $read = TRUE, i onda ne prebacujes na $read = FALSE sve dok se to ne zatvori. Dodas jos jedan counter recimo, tako da za svaku novu tabelu koja se otvori, broj se poveca, i ne prekida da cita dok N tabela nije zatvoreno. Resetujes counter na 0 kada se sve zatvore...

I nije bilo regex-a :)
[ noviKorisnik @ 12.09.2005. 23:14 ] @
Ova alternativa naravno radi samo u vrlo ograničenim slučajevima.

regexpi mi deluju komplikovani da obuhvate opšti slučaj definicije tabele, gde otvarajući tag može da se rastegne u više redova, gde potrebni atributi mogu da budu navedeni proizvoljnim redosledom, gde vrednosti mogu da se zadaju u jednostrukim ili dvostrukim navodnicima, ili bez njih.

Predlog o DOM parsiranju mi se veoma dopada, žao mi je što još nisam stigao da se time poigram u PHP-u, verujem da je zabavno kao i u drugim jezicima.
[ WinterMute @ 13.09.2005. 08:31 ] @
Ovaj će da radi sa bilo kojom kombinacijom ova tri property-ja ali ne kapira ugnježdene tabele...

Code:
$regexp ="/<table\s+?(width=\"150\"\s+?|cellspacing=\"\d+?\"\s+?|cellpadding=\"\d+?\")(width=\"150\"\s+?|cellspacing=\"\d+?\"\s+?|cellpadding=\"\d+?\")(width=\"150\"\s+?|cellspacing=\"\d+?\"\s+?|cellpadding=\"\d+?\")>(.+?)<\/table>/si"


Baš me zanima da li samo koristeći regex uopšte može da se reši problem oko ugnježdavanja...?