Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP, säännölliset lausekkeet

Sivun loppuun

tomitoiv [15.02.2013 10:37:46]

#

Heipähei,

omista aktiivisimmista php-"koodailuajoista" on jo tovi vierähtänyt ja nyt olen jumissa niin helpossa kohtaa, että ihan itseäkin itkettää.

Mulla on dataa muuttujassa, olkoon vaikka:

$data = "<tr>
         <td>1001</td>
         <td>vihreä</td>
         <td>omena</td>
         </tr>
         <tr>
         <td>4698</td>
         <td>keltainen</td>
         <td>banaani</td>
         </tr>
         <tr>
         <td>3466</td>
         <td>punainen</td>
         <td>mansikka</td>
         </tr>";

Tämän haluaisin säännöllisillä lausekkeilla saada muuttujiin, tyyliin:
$id[0] = 1001;
$vari[0] = vihreä;
...
jne

Sanomatta selvää lienee, että todellisuudessa data on aika paljon sotkuisempaa, eikä tietenkään rivitettyä.

Onko fiksuja (fiksumpia) tapoja toteuttaa se kuin tämä:

//
$id = array();
$vari = array();

// Etsitään ensimmäinen <tr>
$tr1 = strpos($data, "<tr>");
// Etsitään sen jälkeen tuleva ensimmäinen <td>
$td1_alku = strpos($data, "<td>", $tr1);
// Etsitään tagin loppu
$td1_loppu = strpos($data, "</td>", $td1_alku);
// Luetaan data muuttujaan
$id[0] = substr($data, $td1_alku, $td1_loppu - $td1_alku);

// Etsitään seuraava <td>
$td2_alku = strpos($data, "<td>", $td1_loppu);
// Etsitään sen loppu..
$td2_loppu = strpos($data, "</td>", $td2_alku);
// Luetaan data muuttujaan
$vari[0] = substr($data, $td2_alku, $td2_loppu - $td2_alku);

Jotenkin tuntuu et teen tän tosi vaikeesti, mut viimekerrasta on kyl tosiaan aikaa..

Toinen nopeempi kyssäri olis, et miten toteutan helposti sen et lasken kuinka monta kertaa tossa datassa on merkkijono "<tr>"?

Grez [15.02.2013 11:00:33]

#

Jos säännöllisillä lausekkeilla on tarkoitus tehdä, niin tokihan siihen voisi soveltaa jotain tämäntyyppistä lauseketta:

<tr>\s*<td>([^<]*)</td>\s*<td>([^<]*)</td>\s*<td>([^<]*)</td>\s*</tr>

Chiman [15.02.2013 11:22:12]

#

tomitoiv kirjoitti:

Toinen nopeempi kyssäri olis, et miten toteutan helposti sen et lasken kuinka monta kertaa tossa datassa on merkkijono "<tr>"?

https://www.php.net/manual/en/function.substr-count.php

Kannattaa käyttää vaikka vartti aikaa siihen, että silmäilee läpi kaikki funktioiden kuvaukset tuolta, niin tietää mitä on tarjolla.
https://www.php.net/manual/en/funcref.php

tomitoiv [15.02.2013 11:45:26]

#

Kiitoksia nopeista vastauksista. Grezin rivi muistutti mieleeni pari pikku "kikkaa", joten eiköhän tästä eteenpäin taas päästä.

Funktiolistan tutkiskelu voisi olla hyvä idis myöskin. Tosin sitä on ite aina tottunut tekemällä oppimaan, joskus se tietää aika purkkasta koodia, mut "mielekkäämpää" niin. :)

The Alchemist [15.02.2013 17:13:36]

#

Ohjelmointikieli ei ole kuin vasara ja naulat tai kuokka. Et voi vain ottaa sitä käteesi ja kokeilla, millaista jälkeä sillä saa eri tavoin käyttäen, ja tulla oppia hallitsemaan työkaluasi sitä kautta.

Mikäli kyse on yksittäisestä taulukosta, niin regexit voivat olla ihan ok keino. Luultavasti ainakin koodia tulee vähiten sillai. Jos rakenne on monimutkaisempi ja esimerkiksi sisältää sisäkkäisiä taulukoita, niin lähtisin rakentamaan parseria state machine -tyylisesti.

Grez [15.02.2013 17:23:37]

#

The Alchemist kirjoitti:

Jos rakenne on monimutkaisempi ja esimerkiksi sisältää sisäkkäisiä taulukoita, niin lähtisin rakentamaan parseria state machine -tyylisesti.

Itse käyttäisin jotain valmista DOM-luokkaa. Eikös PHP:ssa ole valmiinakin domdocument.

The Alchemist [16.02.2013 08:06:29]

#

DOMDocument soveltuu vain validien dokumenttien parsimiseen, joten jos sitä ei voi taata, niin silloin tarvitaan jokin toinen tapa.

Metabolix [16.02.2013 10:39:38]

#

The Alchemist kirjoitti:

DOMDocument soveltuu vain validien dokumenttien parsimiseen,

Onhan olemassa myös DOMDocument::loadHTML, joka tulkitsee huonoakin koodia.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta