Parsing

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Salve ragazzi, ho questo codice dove prelevo del testo da una pagina html:

il testo da prendere si trova in un tag td, eccolo:

<td colspan="3" class="po_header" width="100%">disc</td>

PHP:
$file = file_get_contents("http://url_prova");

$posizione_1 = strpos($file, "<td colspan=\"3\" class=\"po_header\" width=\"100%\">"); 
$posizione_2 = strpos($file, "</td>",$posizione_1);

$testo_ricavato = substr($file,$posizione_1 + 47,$posizione_2-$posizione_1-47); 

echo $testo_ricavato;

Questo funziona, però mi prende solo il primo tag td, quindi se ho più tag td di quel genere, come faccio a prendere tutti i contenuti di quei tag?

Spero di essere stato chiaro.

Grazie
 

lotus

Utente Attivo
5 Mag 2009
543
8
0
Ciao,

non sò se ho capito bene la richiesta:
Esempio assumiamo che ci sia un tag "tr" e dentro vari "td" vuoi sapere come prendere tutti i td o cos'altro?
In generale se vuoi prendere tutto il contenuto di un tag (che magari ne contiene altri ma differenti) estrai la sottostringa che parte dalla posizione del tag, individui l'offset di termine del tag stesso ed estrai fino a lì.

Cmq se fai un esempio specifico forse ti posso aiutare meglio
Ciao, Ciro
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Grazie per la tua risposta, allora ho bisogno di tutto ciò che è contenuto tra i seguenti tag td:

<td colspan="3" class="po_header" width="100%">disc</td>

Di questi tag ne posso avere 1 o mille. Ho fatto questo codice, e funzione, però non posso seguire tutto a mano, come posso fare con un ciclo?

Ecco il codice:

PHP:
$posizione1 = strpos($file, "<td colspan=\"3\" class=\"po_header\" width=\"100%\">", $posizione1); 
$posizione2 = strpos($file, "</td>",$posizione1);

$testo_ricavato = substr($file,$posizione1 + 47,$posizione2 - $posizione1 - 47); 


$posizione3 = strpos($file, "<td colspan=\"3\" class=\"po_header\" width=\"100%\">", $posizione2); //partendo dalla posizione2
$posizione4 = strpos($file, "</td>",$posizione3);

$testo_ricavato1 = substr($file,$posizione3 + 47,$posizione4 - $posizione3 - 47); 

echo $testo_ricavato;
echo '<br/>';
echo $testo_ricavato1;

Spero di essere stato abbastanza chiaro, grazie.
 

lotus

Utente Attivo
5 Mag 2009
543
8
0
Ricapitolo, dimmi se ho capito:

Tu hai un table row (Tr) che contiene vari table column (TD) come le seguenti:
<td colspan="3" class="po_header" width="100%">disc</td>
ti occorre, per ciascuna di esse il contenuto interno alla TD??

Ciao, Ciro
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Ciao, puoi risparmiarti un pel po di parsing :) utilizzando le espressioni regolare cioè le regex.
Utilizza preg_match in questo modo:
PHP:
$str = '<td colspan="3" class="po_header" width="100%">disc</td>';
preg_match("(<td colspan=\"3\" class=\"po_header\" width=\"100%\">([^<]+)</td>)", $str,$matches);
echo $matches[0][0];//Qui avrai il contenuto del tag cioè in questo caso 'disc'

Ovviamente $str puo essere il contenuto del file. La funzione preg_match estrae automaticamente tutto il contenuto dei tag td che presentano quella struttura. Poi basta fare un foreach all'array matches e accedere a tutti i valori
 
Ultima modifica:

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Funziona, con str, però io il contenuto del file lo prendo così:
PHP:
$file = file_get_contents("http://url_prova.html");

preg_match("(<td colspan=\"3\" class=\"po_header\" width=\"100%\">([^<]+)</td>)", $file,$matches);
echo $matches[0][0];

foreach($matches as $m){
echo $m;
}
Non mi stampa niente

Se faccio il var_dump mi stampa questo:

array(0) { }

Come posso risolvere?

Grazie
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Scusa, bastava mettere l'apice singolo nell'url e funzionava, però mi stampa solo il primo contenuto nell'array, facendo il var_dump mi stampa correttamente i contenuti, ecco il codice:

PHP:
$file = file_get_contents('http://url_prova.html');

preg_match_all("(<td colspan=\"3\" class=\"po_header\" width=\"100%\">([^<]+)</td>)", $file,$matches);
echo $matches[0][0]; 

$m = array_unique($matches);


var_dump($m);

Mi stampa questo con il var_dump:
Disk drivearray(1) { [0]=> array(6) { [0]=> string(62) "Disk drive" [1]=> string(65) "Connettività " [2]=> string(72) "Requisiti di sistema" [3]=> string(69) "Peso e dimensioni" [4]=> string(58) "Colori" [5]=> string(74) "Contenuto dell'imballo" } }

Come faccio per visualizzare questi dati dell'array?

Facendo il foreach
PHP:
foreach($m as $a){
echo $a;
}

mi esce fuori questo:
Array

Scusate, non dovrebbe processare l'array con il foreach?

Grazie
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Ho risolto in questo modo:
PHP:
$file = file_get_contents('http://url_prova.html');

preg_match_all("(<td colspan=\"3\" class=\"po_header\" width=\"100%\">([^<]+)</td>)", $file,$matches);

$m = array_unique($matches);


foreach($m[0] as $a){
echo $a;
echo '<br/>';
}

Mi stampa tutto correttamente, però se ora al posto di questo nella funzione

<td colspan=\"3\" class=\"po_header\" width=\"100%\">([^<]+)</td>

vorrei inserirci quest'altro?

<td class="po_lab" width="40%" style="font-size: 70%;" colspan="2">disc<span style="color:red;display:none;">*</span></td>

ho fatto cosi, ma il var_dump mi restituisce NULL

<td class=\"po_lab\" width=\"40%\" style=\"font-size: 70%;\" colspan=\"2\">([^<]+)<span style=\"color:red;display:none;\">*</span></td>

Come devo fare?

Scusate ma al momento non ci capisco niente con le espressioni regolari.

Grazie
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
il carattere '*' che é nel tag span appartiene ai caratteri speciali delle regex. Quindi devi fare in modo che lo consideri un carattere della stringa:
Codice:
$regex = '<td class="po_lab" width="40%" style="font-size: 70%;" colspan="2">([^<]+)<span style="color:red;display:none;">\\*</span></td>';
$file = file_get_contents('http://url_prova.html');
preg_match_all($regex, $file,$matches);
Come vedi bisogna inserire '\\' prima di '*' nella $regex
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Grazie per il tuo aiuto, però ora ho l'ultima domanda da porti.

Se in mezzo a quei tag td mi ritrovo un'immagine?

Cioè ho anche la possibilità che trovi un tag strutturato così:

<td class="d_a" width="60%" style="font-size: 70%"><img src="http://indirizzo_immagine" border="0" alt="" ></td>

Come mi comporto?

Ti ripeto con le espressioni regolari non vado daccordo, però prima o poi le studierò per benino.
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Ciao intimoviro, duqnue dipende da cosa vuoi fare. Mi spiego, se a te serve l'url dell'immagine allora dovresti costruirti un'altra regex che estrae l'attributo src="" dal tag img:
PHP:
$regexImg = '/<img.*?src=([\'"])([^"\1]+)\1/i';
Tutto dipende dai tuoi obiettivi, altrimenti se trovi un tag img basta ignorarlo quando fai il for sul $matches.

Purtroppo estrarre i dati da codice html dove non si sa di preciso il contenuto è abbastanza complesso, nel senso che all'interno puoi trovarti di tutto e quindi per ogni tipo di contenuto dovresti costruirti una regex per identificarlo e compiere le azioni opportune.

Le espressioni regolari effettivamente sono un po difficili da 'masticare' pero in compenso (come puoi notare) sono molto potenti nel riconoscere stringhe particolari all'interno dei testi e ti risparmiano parecchie righe di codice. Se vuoi posso consigliarti un buon articolo:
Le espressioni regolari in PHP

Ciao e buon lavoro
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Grazie, però come faccio a fare un confronto, cioè mi spiego meglio, in pratica dovrei fare se esiste un testo nella funzione preg_match_all tutto ok, altrimenti vedi se esiste un'immagine.

Grazie
 

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Forse mi sono spiegato male, in pratica il tag td può essere sia così:

<td class="po_data" width="60%" style="font-size: 70%">disc</td>

che così:

<td class="po_data" width="60%" style="font-size: 70%"><img src="http://url/images/imm.gif" border="0" alt="" ></td>

Quindi in pratica a me serve prendere tutto quello che trovo in questi tag, sia stringhe che immagini.

Per quanto riguarda l'immagine anche prendere tutta la stringa html, cioè: <img src="http://url/images/imm.gif" border="0" alt="" >

Grazie
 

Discussioni simili