Yritän rss syötteestä parsia tavaraa erikseen, ei onnistu sitten millään...
Onko tosiaan niin että preg_match_all fungtiolla ei onnistu useamman rivin nappaamista...
preg_match_all("/<item>(.*)</item>/", $sivu, $uutiset);
Koodi mistä kerättäs noi item tagien välillä oleva data talteen...
<?xml version="1.0" encoding="iso-8859-1" ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>Iltalehti.fi tuoreimmat uutiset</title> <link>http://www.iltalehti.fi/etusivu/</link> <description>Iltalehden 20 tuoreinta uutista</description> <language>fi</language> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <lastBuildDate>Wed, 04 May 2011 15:42:30 +0300</lastBuildDate> <image> <url>http://static.iltalehti.fi/kuvat/navi/logo.gif</url> <title>Iltalehti.fi tuoreimmat uutiset</title> <link>http://www.iltalehti.fi/etusivu/</link> <width>143</width> <height>29</height> </image> <item> <title>Katainen odottaa Portugali-kantaa työryhmältään</title> <link>http://www.iltalehti.fi/uutiset/201105040152143_uu.shtml</link> <guid>http://www.iltalehti.fi/uutiset/201105040152143_uu.shtml</guid> <description>Hallitustunnustelija Jyrki Kataisen (kok) mielestä Portugalin tukipaketin kohtalo on eduskuntaryhmien käsissä. Hänen mukaansa eduskuntaryhmien edustajista kootun työryhmän olisi tehtävä esitys Suomen kannasta. Katainen sanoi ennen kokoomuksen eduskuntaryhmän kokousta iltapäivällä, että eduskuntaryhmien on etsittävä kanta, jolla on enemmistö eduskunnassa. Jos paketti halutaan kaataa, Katainen on valmis edustamaan sitä kantaa euroryhmässä.</description> <pubDate>Wed, 04 May 2011 15:42:30 +0300</pubDate> </item> <item> <title>Pakistan: Koko maailma epäonnistui bin Ladenin etsinnäissä</title> <link>http://www.iltalehti.fi/ulkomaat/2011050413657855_ul.shtml</link> <guid>http://www.iltalehti.fi/ulkomaat/2011050413657855_ul.shtml</guid> <description>Pakistan ei suostu syntipukiksi terroristijohtaja Osama bin Ladenin etsinnäissä. Pakistanin pääministeri Jusuf Raza Gilani sanoi keskiviikkona, että kaikki maat, myös Yhdysvallat, epäonnistuivat bin Ladenin etsinnäissä, koska ne kestivät kymmenen vuotta. – Kaikki maailman tiedustelupalvelut epäonnistuivat, ei vain Pakistanin, Gilani sanoi vierailullaan Ranskassa. </description> <pubDate>Wed, 04 May 2011 15:41:00 +0300</pubDate> </item> <item> <title>Palestiinalaisjärjestöjen johtajat sinetöivät sopunsa Kairossa</title> <link>http://www.iltalehti.fi/ulkomaat/2011050413657833_ul.shtml</link> <guid>http://www.iltalehti.fi/ulkomaat/2011050413657833_ul.shtml</guid> <description>Kilpailevien palestiinalaisjärjestöjen Fatahin ja Hamasin johtajat ovat sinetöineet tänään yhteistyösopimuksen Kairossa pidetyssä seremoniassa. Palestiinalaisten presidentti Mahmud Abbas ilmoitti, että erimielisyyksien synkkä vaihe on nyt lopullisesti historiaa. Hamas-äärijärjestön johtaja Khaled Meshaal puolestaan sanoi, että Hamas on valmis maksamaan minkä tahansa hinnan palestiinalaisten välisestä sovinnosta. Hän korosti, että Hamasin tavoitteena on sekä Gazan että Länsirannan alueet kattava itsenäinen palestiinalaisvaltio. </description> <pubDate>Wed, 04 May 2011 15:40:00 +0300</pubDate> </item> <item> <title>Pääkaupunkiseudulla tuhkarokkoa vuosien tauon jälkeen</title> <link>http://www.iltalehti.fi/uutiset/2011050413657820_uu.shtml</link> <guid>http://www.iltalehti.fi/uutiset/2011050413657820_uu.shtml</guid> <description>Suomessa on useiden vuosien tauon jälkeen todettu tuhkarokkoa, joka on tarttunut kotimaassa. Neljä aikuista ja kaksi lasta on sairastunut pääkaupunkiseudulla huhtikuun puolivälin jälkeen, kertoo Terveyden ja hyvinvoinnin laitos (THL). Sairastuneita ei ole rokotettu tuhkarokkoa vastaan, tai he ovat saaneet vain yhden rokoteannoksen. </description> <pubDate>Wed, 04 May 2011 15:26:00 +0300</pubDate> </item>
Postaamasi koodi oli turhan pitkä. 1-2 itemiä olisi riittänyt.
Säännöllisessä lausekkeessasi on se ongelma, että < ja > ovat erikoismerkkejä. Jos niitä haluaa käyttää tavallisina merkkeinä, pitää niiden eteen laittaa kaksi kenoviivaa (\\).
Kokeile laittaa preg_match_all("/\<item\>(.*?)\</item\>/", $sivu, $uutiset);, jossa ?-merkki hakee lyhimmän mahdollisen osuman.
Edit: Korjattu villev:n erikoismerkit
preg_match_all("/\\<item\\>(.*)\\<\/item\\>/", $sivu, $uutiset);
Tulostin
print_r($uutiset);
Tulostus
Array ( [0] => Array ( ) [1] => Array ( ) )
preg_match_all("/\<item\>(.*?)\</item\>/", $sivu, $uutiset);
Antaa virheilmoituksen
Warning: preg_match_all(): Unknown modifier 't' in C:\xampp\htdocs\rss\parseri_002.php on line 8
Aamusta asti takunnut tuon kanssa... Ei polla säteile enää yhtään...
Merkeissä < ja > ei ole ongelmaa, ne voivat olla sellaisenaan lausekkeessa. Sen sijaan lopetustagissa oleva merkki / vaatii eteen merkin \. Lisäksi sisällön tunnistavaan osaan kannattaa liittää merkki ?, jotta se valitsee mahdollisimman lyhyen osan.
Tämän koodin pitäisi toimia:
<?php $sivu = "alku <item>kohta1</item> <item>kohta2</item> loppu"; preg_match_all("/<item>(.*?)<\/item>/", $sivu, $uutiset); print_r($uutiset); ?>
Miksei merkkien < ja > eteen tarvita kenoviivaa?
Putkan sl-opas kirjoitti:
Kuitenkin muutamien merkkien eteen pitää panna kenoviiva (\), koska niillä on muuten erikoistehtävä. Erikoismerkit ovat: /\.^$[]|()+*?!{}=:<>.
Merkeillä =:<>!/ on erikoistehtävä vain tietyissä tilanteissa, esimerkiksi (?<=sana)
. Erityisesti merkillä / on erikoismerkitys vain silloin, kun sitä käytetään lausekkeen alun ja lopun merkkinä. Minusta on kätevämpää valita alku- ja loppumerkki toisin, jos lauseke sisältää /-merkkejä.
Näin onnistuu ihan ok...
$sivu = file_get_contents("https://www.ohjelmointiputka.net"); preg_match_all("/<title>(.*?)<\/title>/", $sivu, $uutiset); $tuloksia = count($uutiset[0]); print_r ($uutiset); print"tuloksia $tuloksia<BR><BR>";
Tulostaa:
Array ( [0] => Array ( [0] => ) [1] => Array ( [0] => Ohjelmointiputka ) ) tuloksia 2
Sitten taas kun koittaa...
$sivu = file_get_contents("http://www.iltalehti.fi/rss/uutiset.xml"); preg_match_all("/<title>(.*?)<\/title>/", $sivu, $uutiset); $tuloksia = count($uutiset[0]); print_r ($uutiset); print"tuloksia $tuloksia<BR><BR>";
Tulostaa:
Array ( [0] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] => [18] => [19] => [20] => [21] => ) [1] => Array ( [0] => Iltalehti.fi tuoreimmat uutiset [1] => Iltalehti.fi tuoreimmat uutiset [2] => Toivo hiipui Meksikon turmakaivoksessa [3] => Eduskunnan Portugali-pakka on aivan sekaisin [4] => Tukholman keskustassa riehui suurpalo [5] => USA:n oikeusministeri: Bin Ladenin tappaminen itsepuolustusta [6] => Lahtelaisen kultaliikkeen ryöstöstä epäilty kolmikko vangittiin [7] => Riehuva nainen sylki poliisin suuhun [8] => Bin Ladenia jahdannut ösamuraimiekkamiesö vaatii itselleen osuutta löytöpalkkiosta [9] => Osaman koodinimi Geronimo raivostuttaa USA:ssa [10] => Europol varoittaa: Järjestäytynyt rikollisuus yhä monimuotoisempaa [11] => GSM-puheluita voi kuunnella salaa entistä helpommin [12] => Katainen odottaa Portugali-kantaa työryhmältään [13] => Työtapaturmassa loukkaantunut kuoli sairaalassa [14] => Kansanedustaja sai kakkaa postissa [15] => Kateissa ollut nuori tyttö löytyi hyväkuntoisena [16] => Kristillisdemokraatit hyväksyy Portugali-järjestelyn [17] => Espanja langetti merirosvoille 439 vuoden tuomiot [18] => Palestiinalaisjärjestöjen johtajat sinetöivät sopunsa Kairossa [19] => Pääkaupunkiseudulla tuhkarokkoa vuosien tauon jälkeen [20] => Mies hukkui mökkirantaan Asikkalassa [21] => Laaja kiristysvyyhti Kouvolassa: Syrjäytyneiltä vietiin koko omaisuus ) ) tuloksia 22
Ylläolevaan vaihtaa title tekstien tilalle item, niin tulostus onkin jo:
Array ( [0] => Array ( ) [1] => Array ( ) ) tuloksia 0
Kokeilee http://www.hs.fi/rss/?osastot=kotimaa sieltä poimia item tagien välinen koodi, ei mitään ongelmaa...
Jos haettava teksti on monen rivin mittainen, lausekkeen loppuun pitää lisätä s-valitsin, jotta piste kelpuuttaisi myös rivinvaihdot.
Suuret kiitokset kaikille... Se perskeles oli tuo yksi pieni s kirjain, mikä vei minulta varmaan 6-8h aikaa...
Nyt saa miettiä uusiksi, millanen koodi oli, ennen kuin muuttui 100 kertaan kun sai takuta tuon kanssa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.