Jospa onkin taulukko, jossa on pelkkää tietoa (ei siis otsikoita tms. ollenkaan) like so:
pulla kahvi munkki lollipop ja joo
Miten voisin esim. PHP:llä tehdä niin, että koodi lukee taulukon sisällön, välittämättä mitä attribuutteja ym. härpäkkeitä tageissa on, ja pistelee sen Arrayhin, jolloin esimerkkitaulukosta tulee sama kuin:
$juttu = Array("pulla", "kahvi", "munkki", "lollipop", "ja joo");
Huomaa, ettei se ottanut tuota alakulmassa olevaa tyhjää td:tä, joka kaikesta huolimatta on olemassa.
Mitään print_r:n tyylistä tulostusta tästä ei tarvitse tehdä, kun tämä on vain minulle, ja käytän tätä arrayta vielä ja sitäpaitsi olisin taas samassa jamassa kun alussakin, tiedot pitää saada arrayhin.
Selitän taas liikaa, joten jospa lopettaisin tähän.
Vinkki: Haet preg_match_all-funktiolla td-tagien välisen sisällön.
https://www.ohjelmointiputka.net/keskustelu/9597-preg-match-all-yksinkertasemmillaan
https://www.ohjelmointiputka.net/oppaat/opas.
Lauseke lienee jotakin tyyliin "/<td.*?>(.*?)<\/td>/i", mutta en ole testannut tuota.
Aliarvioin taas kykyni niin kuin tavallisestikin, ja onnistuin kuin onnistuinkin. Kiinnostuneille oma revitykseni, tiedä häntä optimoinnista tai puristetusta koodista:
<?php $table = ''; preg_match_all("/<td.*?>(.*?)<\/td>/i", $table, $output); echo "Array("; for($i=0;$i<count($output[1])-1;$i++){ echo '"'.$output[1][$i].'", '; } $last = count($output[1])-1; echo '"'.$output[1][$last].'");'; ?>
Uusi ongelma!
Entäs sitten kun taulukko onkin tyyliin
Pulla 5 euroa Päällä raesokeria. Lettu, Karkki 14 euroa/kpl Hyvää suuhunpantavaa. Kahvi 17 euroa Pahvikuppi kaupan päälle.
...ja haluan samanlaisen arrayn kuin äskenkin:
$juttu = Array("Pulla", "Lettu", "Karkki", "Kahvi");
Eli luetaan vain ensimmäisestä sarakkeesta (pystyrivi) JA erotellaan pilkulla ja välillä olevat sanat omiin arrayn... tietueisiin/mitä ne nyt on. Järjestyksellä ei ole mitään väliä.
Kiitos!
Aliarvioit taas Juicen kyvyt ;)
Ja nyt haet lienee jotain tyyliin:
preg_match_all("/<tr.*?><td.*?>(.*?)<\/td>/i", $table, $output);
JTS kirjoitti:
Aliarvioit taas Juicen kyvyt ;)
Nekin, mutta yleensä vihje-funktiot ei minua paljon auta vaan joudun ruinaamaan kunnes joku hyväntekijä (Blaze ja.. ja, eh... öhh.. noh, Blaze) antaa valmiin koodin. Tällä kertaa sain koodin toimimaan 3 pisteen vihjeen avulla, eli aliarvioin myös omat kykyni.
Kun nämä preg_match_all:in merkinnät ovat minulle jopa ylitsepääsemättömän hieroglyyfisiä, pitää kysyä: mitä tuohon <tr.*?> ja <td.*?> väliin pitäisi laittaa, jotta se hyväksyisi sen rivinvaihdolla ja ilman?
<tr> <td>jotain mikä pitäis olla arrayssa niin kuin olis jo</td> <td>jotain mikä siellä EI pitäis olla :(</td> </tr>
EDIT: RATKAISIN ONGELMAN ITSE, TAAS ALIARVIOIDEN OMAT KYKYNI MITÄ SUURIMASSA MÄÄRIN.
Voit pistää sille "lipun" että käsittelee koko roskan yksirivisenä:
http://www.futureality.net/tuotteet/oppaat/2/
lainaus:
m (PCRE_MULTILINE)
Tällä voidaan kiertää oletus jossa PCRE olettaa merkkijonojen olevan yksirivisiä. Tämän määrittelyn lisäämällä käsitellään rivinvaihtoja omaavaa merkkijonoa yksirivisenä.
Elikä tämä lienee toiminee:
preg_match_all("/<tr.*?><td.*?>(.*?)<\/td>/im", $table, $output);
tai tämä vaihtoehtoisesti voisi myös toimia:
preg_match_all("/<tr.*?>.*?<td.*?>(.*?)<\/td>/is", $table, $output);
Voit vaihtoehtoisesti myös pistää haluttuihin paikkoihin merkinnän että siinä saa olla \n merkintä (tai jokin muu rivinvaihtomerkki) äärettömän monesti.
Suosittelen tutustumaan regexpeihin, putkassa on suht. hyvä opas, ja juurikin tuola LeftOverin sivuilla on toinen. Monessa paikassa nuo ovat tulleet todella tarpeeseen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.