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>"?
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>
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
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. :)
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.
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.
DOMDocument soveltuu vain validien dokumenttien parsimiseen, joten jos sitä ei voi taata, niin silloin tarvitaan jokin toinen tapa.
The Alchemist kirjoitti:
DOMDocument soveltuu vain validien dokumenttien parsimiseen,
Onhan olemassa myös DOMDocument::loadHTML, joka tulkitsee huonoakin koodia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.