Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Taulukosta varastaminen

SysRq868 [07.01.2006 12:49:12]

#

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.

Juice [07.01.2006 14:07:50]

#

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.php?tunnus=phpsl

Lauseke lienee jotakin tyyliin "/<td.*?>(.*?)<\/td>/i", mutta en ole testannut tuota.

SysRq868 [07.01.2006 16:48:39]

#

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!

kayttaja-2791 [07.01.2006 17:34:51]

#

Aliarvioit taas Juicen kyvyt ;)

Ja nyt haet lienee jotain tyyliin:

preg_match_all("/<tr.*?><td.*?>(.*?)<\/td>/i", $table, $output);

SysRq868 [07.01.2006 18:59:10]

#

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.

kayttaja-2791 [07.01.2006 19:13:06]

#

Voit pistää sille "lipun" että käsittelee koko roskan yksirivisenä:
http://www.futureality.net/tuotteet/oppaat/2/index.php?kappale=kaikki

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.

Vastaus

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

Tietoa sivustosta