Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    Estrazione dati tramite espressioni regolari, un caso complesso..

    Ragazzi ho un estrazione dati da codice HTML che mi sta facendo impazzire.. Devo estrarre dei dati da una tabella in una pagina html, ed ho creato una funzione apposita tramite le espressioni regolari, che fa il suo lavoro. Il fatto è che riesco ad estrarre gli argomenti in blocco, cioè tutto il blocco all'interno dei tag di tabella quando a me servirebbe estrarre i valori contenuti nei campi singolarmente. La tabella è molto carica di informazioni "spazzatura" e mi interessa isolare solo l'info effettivamente a me utile.

    Mi spiego meglio direttamente tramite il codice:

    QUESTA è LA TABELLA

    Codice PHP:
    <TABLE  CLASS="menuplaintable" summary="This layout table holds the menu items">
    <
    TR>
    <
    TD CLASS="mpdefault"></TD>
    <
    TD CLASS="mpdefault">
    [
    url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_GenMnu"]Personal Information[/url]


    <
    SPAN class=menulinkdesctext >View and update emergency contact information;  Review name or social security number change information.</SPAN>
    </
    TD>
    </
    TR>
    <
    TR>
    <
    TD CLASS="mpdefault"></TD>
    <
    TD CLASS="mpdefault">
    [
    url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_StuMainMnu"]Student and Financial Aid[/url]



    <
    SPAN class=menulinkdesctext >Register for classesDisplay your class scheduleView your holdsDisplay grades/transcriptsReview financial aid requirements/awards; [b]Charges/Payments/Refunds Please view your account through the online Account Center.  The link is located after you login to Braveweb but before you enter Banner Self Service.[/b]</SPAN>
    </
    TD>
    </
    TR>
    <
    TR>
    <
    TD CLASS="mpdefault"></TD>
    <
    TD CLASS="mpdefault">
    [
    url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=pmenu.P_MainMnu"]Employee[/url]


    <
    SPAN class=menulinkdesctext >Time sheetstime offbenefitsleave or job datapaystubsW4 data.</SPAN>
    </
    TD>
    </
    TR>
    </
    TABLE
    Questo è lo script php che ho realizzato:
    Codice PHP:
    <?php 
    //salvo la tabella sotto stringa

    $url "lapaginachecontienelatabella.html";
    $page = @file_get_contents($url) or die('Could not access file: $url');

    //estraggo in blocco la tabella che mi serve

    $regexp "/\s<TABLE  CLASS=\"menuplaintable\" summary=\"This layout table holds the menu items\">(.*)<\/TABLE>/siU";
    preg_match_all("$regexp"$page$matchesPREG_SET_ORDER);
    foreach(
    $matches as $match) {
    //print_r($match);
    $Result $match[0];
    }
    echo 
    $Result;
    ?>
    Quello che vorrei ottenere è raffinare la ricerca per isolare solamente i 3 links e i relativi 3 nomi con relativi 3 descrizioni. Magari inserendo i dati estratti in 3 array differenti per poi richiamarli quando li devo riutilizzare:

    ARRAY UNO: arrayurl
    conterrà i vari link nudi e crudi
    $arrayurl [0] = "/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_GenMnu";

    $arrayurl [1] = "/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_StuMainMnu";

    $arrayurl[2] ="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=pmenu.P_MainMnu" ;

    ARRAY DUE: arraytitoli
    conterrà i nomi associati ai link
    $arraytitoli [0] = "Personal Information";
    $arraytitoli [1] = "Student and Financial Aid";
    $arraytitoli [2] = "Employee";

    ARRAY TRE: arraydescrizioni
    conterrà le tre descrizioni delle pagine a cui puntano i link.
    $arraydescrizioni [0] = "View and update emergency contact information; Review name or social security number change information."

    $arraydescrizioni [1] = "Register for classes; Display your class schedule; View your holds; Display grades/transcripts; Review financial aid requirements/awards; [b]Charges/Payments/Refunds - Please view your account through the online Account Center. The link is located after you login to Braveweb but before you enter Banner Self Service.";

    $arraydescrizioni [2] = "Time sheets, time off, benefits, leave or job data, paystubs, W4 data.";

    Come fareste per isolare questi valori singolarmente cosi come li ho proposti in quel caos di tag e codice html mal scritto che è in quella tabella?
    :mc:
    :help:

  2. #2
    Codice PHP:
    $pattern '#[url="([^"]]*>([^<]*)[/url]\\s*
    \\s*<SPAN[^>]*>(.*?)</SPAN>#si'


  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14
    Praticamente hai risolto con una riga.. succede sempre così!

    Saresti cosi gentile da spiegarmi dettagliatamente cosa fa ogni singolo simbilo e con quale criterio si ragiona per incastrare un valore dopo l'altro in modo da creare l'espressione regolare più adatta al caso specifico?

    Ho bisogno di capire, perche devo applicare il metodo anche ad altre pagine con dati differenti.. ho letto alcune guide sulle espressioni regolari, fino a livelli base ci sono, ma con questa stringa mi hai spiazzato, non ti seguo..

    Cmq grazie mille!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    Visto in dettaglio..

    Ho inserito la tua proposta nel mio script in questo modo (giusto per testarne il funzionamento):

    Codice PHP:
    <?php 
    //salvo la pagina
    $url "paginatest.html";
    $page = @file_get_contents($url) or die('Could not access file: $url');

    $pattern '#[url="([^"]]*>([^<]*)[/url]\s*
    \s*<SPAN[^>]*>(.*?)</SPAN>#si'
    ;
    preg_match_all("$pattern"$page$matchesPREG_SET_ORDER);
    foreach(
    $matches as $match) {
    $Result $match[0];
    echo 
    "$Result";
    }
    ?>
    il risultato che ottengo a schermo è il seguente:

    Personal Information
    View and update emergency contact information; Review name or social security number change information.
    Student and Financial Aid
    Register for classes; Display your class schedule; View your holds; Display grades/transcripts; Review financial aid requirements/awards; Charges/Payments/Refunds - Please view your account through the online Account Center. The link is located after you login to Braveweb but before you enter Banner Self Service.
    Employee
    Time sheets, time off, benefits, leave or job data, paystubs, W4 data.

    Il codice html del risultato ottenuto è il seguente:

    Codice PHP:
    [url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_GenMnu"]Personal Information[/url]


    <
    SPAN class=menulinkdesctext >View and update emergency contact information;  Review name or social security number change information.</SPAN>[url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_StuMainMnu"]Student and Financial Aid[/url]



    <
    SPAN class=menulinkdesctext >Register for classesDisplay your class scheduleView your holdsDisplay grades/transcriptsReview financial aid requirements/awards; [b]Charges/Payments/Refunds Please view your account through the online Account Center.  The link is located after you login to Braveweb but before you enter Banner Self Service.[/b]</SPAN>[url="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=pmenu.P_MainMnu"]Employee[/url]


    <
    SPAN class=menulinkdesctext >Time sheetstime offbenefitsleave or job datapaystubsW4 data.</SPAN
    Le informazioni sono tutte agglomerate insieme e sono allo stesso punto di partenza. Mi trascino dietro anche molti tag html che non voglio ottenere. Come posso ottenere i 3 array distinti, con i singoli elementi separati, come descritto nell'altr post? Sbaglio qualcosa io?

    Ho bisogno di avere i singoli elementi per inserirli al mio richiamo in un altra struttura html formattata in un altro modo. Quindi mi servono gli elementi ASSOLUTI, url del link, nome del link, descrizione, tutto senza tag.

    Ad esempio i link:
    Attualmente ottengo
    Codice PHP:
    <A HREF="/tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_GenMnu"  class=submenulinktext2 onMouseover="window.status='Personal Information'; return true" onMouseout="window.status=''; return true" onFocus="window.status='Personal Information'; return true" onBlur="window.status=''; return true" 
    ma vorrei ottenere semplicemente il percorso dell'url niente di piu cioè:
    /tsbss/pls/TEST/twbkwbis.P_GenMenu?name=bmenu.P_GenMnu

    Ho pensato ad una seconda azione di ripulitura sulla stringa ottenuta, tramite uno str_replace ma non mi sembra una soluzione molto pulita. Ci sarebbe un modo più diretto tramite un'espressione regolare per andare direttamente a prelevare ciò che mi serve?

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    OK CI SONO..

    Ok Filippo, studiando un po meglio il codice e facendo gli opportuni test mi sono accorto che mi hai fornito la soluzione completa! BASTA SAPERLA LEGGERE!..

    Adesso ti devo chiedere urgentemente COME HAI FATTO A METTERE TUTTO CIO' CHE TI AVEVO RICHIESTO IN UNA SOLA ISTRUZIONE?? Non riesco a capire con esattezza tutti i passaggi, ogni simbolo fa una cosa specifica.. se potessi fornirmi una spiegazione mi aiuterebbe molto a capire come funziona. Lo strumento è molto piu performante di quanto credevo..

    Grazie di nuovo

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    SPIEGAZIONE PLEASE

    Qualcuno potrebbe spiegare questo pattern?

    Codice PHP:
    $pattern '#[url="([^"]]*>([^<]*)[/url]\s*
    \s*<SPAN[^>]*>(.*?)</SPAN>#si'


  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14
    Ok grazie non serve più.. l'ho decifrato!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.