Remote rss bestand openen
Ik ben bezig met het schrijven van een script om een rss feed uit te lezen op mijn website. Het probleem is alleen dat ik geen gebruik kan maken van fopen (); omdat ik volgens de instellingen in mijn php.ini geen remote files kan openen.
Nu schijnt er een javascript alternatief te zijn om toch remote files te openen. Weet iemand misschien hoe dit werkt?
Alvast bedankt!
domdocument.load kan ook van andere server laden. Weet alleen eigenlijk niet of dat werkt als safe mode aanstaat.
Javascript oplossingen zijn niet oké.
Javascript oplossingen zijn niet oké.
Er moet toch een manier zijn?!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if (function_exists('curl_init')) {
// initialize a new curl resource
$ch = curl_init();
// set the url to fetch
curl_setopt($ch, CURLOPT_URL, $feed_link);
// don't give me the headers just the content
curl_setopt($ch, CURLOPT_HEADER, 1);
// return the value instead of printing the response to browser
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// use a user agent to mimic a browser
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
$file_feed = curl_exec($ch);
// remember to always close the session and free all resources
curl_close($ch);
} else {
// curl library is not installed so we better use something else
}
echo($file_feed);
// initialize a new curl resource
$ch = curl_init();
// set the url to fetch
curl_setopt($ch, CURLOPT_URL, $feed_link);
// don't give me the headers just the content
curl_setopt($ch, CURLOPT_HEADER, 1);
// return the value instead of printing the response to browser
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// use a user agent to mimic a browser
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
$file_feed = curl_exec($ch);
// remember to always close the session and free all resources
curl_close($ch);
} else {
// curl library is not installed so we better use something else
}
echo($file_feed);
Probleem is dat hij alle tags verwijderd. Zodat ik met preg_match geen titles, links, PubDates etc kan verkrijgen.
Hoet goede nieuws is wel dat hij 'm wel kan openen. Iemand oplossing om ook tags te laten zien?!
Ehm.. Hebben we het over XML of een gewone html pagina?
Geef eens een link van de betreffende RSS feed.
http://twitter.com/statuses/user_timeline/39709745.rss.
Maar ik heb het probleem opgelost door
toe te voegen.
Ik heb nu de inhoud van het bestand in $file_feed. Nu probeer ik de items eruit te halen met preg_match();
Het resultaat is "Array". Doe ik iets verkeerd?
Ik bedoel dat mijn hosting die simplexml functie niet accepteerd. Het is een twitter rss file: Maar ik heb het probleem opgelost door
toe te voegen.
Ik heb nu de inhoud van het bestand in $file_feed. Nu probeer ik de items eruit te halen met preg_match();
Code (php)
1
2
2
$get_items = preg_match_all("/<item>(.*)<\/item>/", $file_feed, $matches);
echo $matches['0'];
echo $matches['0'];
Het resultaat is "Array". Doe ik iets verkeerd?
Doe eens
echo '<pre>';
print_r $matches;
echo '</pre>';
De goede regex =
#<item>(.*)<\/\item>#
Dat gerunt op <item>blabla</item> geeft als result:
Array
(
[0] => Array
(
[0] => <item>blabla</item>
)
[1] => Array
(
[0] => blabla
)
Dus dan echo je $var[1][0]
Gewijzigd op 01/01/1970 01:00:00 door Stefan
Dat doe je dus ergens zelf.
En je gaat al helemaal niet met preg_* op een xml bestand werken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<link/>http://twitter.com/nielsborn
<atom:link rel="self" href="http://twitter.com/statuses/user_timeline/39709745.rss" type="application/rss+xml">
<description>Twitter updates from Niels Born / nielsborn.</description>
<language>en-us</language>
<ttl>40</ttl>
<item>
<description>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</description>
<pubdate>Wed, 07 Oct 2009 14:49:38 +0000</pubdate>
<guid>http://twitter.com/nielsborn/statuses/4683644158</guid>
<link/>
http://twitter.com/nielsborn/statuses/4683644158
</item>
</atom:link>
</channel>
</rss>
<channel>
<link/>http://twitter.com/nielsborn
<atom:link rel="self" href="http://twitter.com/statuses/user_timeline/39709745.rss" type="application/rss+xml">
<description>Twitter updates from Niels Born / nielsborn.</description>
<language>en-us</language>
<ttl>40</ttl>
<item>
<description>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</description>
<pubdate>Wed, 07 Oct 2009 14:49:38 +0000</pubdate>
<guid>http://twitter.com/nielsborn/statuses/4683644158</guid>
<link/>
http://twitter.com/nielsborn/statuses/4683644158
</item>
</atom:link>
</channel>
</rss>
Hoe kan ik deze string ontleden?
Gewijzigd op 01/01/1970 01:00:00 door Niels
Maar je hebt dus een xml string terug gekregen dus dan kan je met dom of simplexml aan de slag.
Als je die twee niet tot de beschikking hebt, raad ik je aan om te vragen aan je host om dat aan te zetten, aangezien goede xml support erg belangrijk is. Anders naar een andere host gaan.
Ik heb geen kennis van dom of simplexml. En uit de voorbeelden word ik ook niets wijzer. Heeft iemand misschien ervaring met het ontleden van een xml string met dom of simplexml?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Twitter / nielsborn</title>
<link>http://twitter.com/nielsborn</link>
<atom:link type="application/rss+xml" href="http://twitter.com/statuses/user_timeline/39709745.rss" rel="self"/>
<description>Twitter updates from Niels Born / nielsborn.</description>
<language>en-us</language>
<ttl>40</ttl>
<item>
<title>nielsborn: testtesttesttesttest</title>
<description>nielsborn: testtesttesttesttest</description>
<pubDate>Sun, 22 Nov 2009 19:08:09 +0000</pubDate>
<guid>http://twitter.com/nielsborn/statuses/5952620172</guid>
<link>http://twitter.com/nielsborn/statuses/5952620172</link>
</item>
<item>
<title>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</title>
<description>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</description>
<pubDate>Wed, 07 Oct 2009 14:49:38 +0000</pubDate>
<guid>http://twitter.com/nielsborn/statuses/4683644158</guid>
<link>http://twitter.com/nielsborn/statuses/4683644158</link>
</item>
</channel>
</rss>
XML;
$xml = simplexml_load_string($string);
foreach($xml->channel->item as $item)
{
var_dump($item);
}
var_dump($xml);
?>
$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Twitter / nielsborn</title>
<link>http://twitter.com/nielsborn</link>
<atom:link type="application/rss+xml" href="http://twitter.com/statuses/user_timeline/39709745.rss" rel="self"/>
<description>Twitter updates from Niels Born / nielsborn.</description>
<language>en-us</language>
<ttl>40</ttl>
<item>
<title>nielsborn: testtesttesttesttest</title>
<description>nielsborn: testtesttesttesttest</description>
<pubDate>Sun, 22 Nov 2009 19:08:09 +0000</pubDate>
<guid>http://twitter.com/nielsborn/statuses/5952620172</guid>
<link>http://twitter.com/nielsborn/statuses/5952620172</link>
</item>
<item>
<title>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</title>
<description>nielsborn: Super filmpje op: http://bit.ly/2SLLBh Lijst</description>
<pubDate>Wed, 07 Oct 2009 14:49:38 +0000</pubDate>
<guid>http://twitter.com/nielsborn/statuses/4683644158</guid>
<link>http://twitter.com/nielsborn/statuses/4683644158</link>
</item>
</channel>
</rss>
XML;
$xml = simplexml_load_string($string);
foreach($xml->channel->item as $item)
{
var_dump($item);
}
var_dump($xml);
?>
De gewenste output is:
Code (php)
1
<a href="$guid" title="$title" class="tweets"><strong><span>$pubDate</span>'.$title.'</strong></a>'
Kun je me nog iets verder op weg helpen?!
EDIT:
Ik heb het eindelijk voor elkaar. De oplossing:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function get_tweets(){
// Editable below
$feed_link = 'http://twitter.com/statuses/user_timeline/39709745.rss';
$max_items = '5';
$max_length = '70';
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $feed_link);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
$ch2 = curl_copy_handle($ch);
$file_feed = curl_exec($ch2);
curl_close($ch2);
curl_close($ch);
} else {
// curl library is not installed so we better use something else
}
$xml = simplexml_load_string($file_feed);
$q_items = sizeof($xml->channel->item);
if($q_items < $max_items){
$max_items = $q_items;
}
for ($i = 0; $i < $max_items; $i++){
$title = $xml->channel->item[$i]->title;
$title = str_replace('nielsborn: ', '', $title);
if(strlen($title) > $max_length){
$title = substr($title, 0, $max_length);
$title .= '...';
}
$description = $xml->channel->item[$i]->description;
$description = str_replace('nielsborn: ', '', $description);
$pubDate = $xml->channel->item[$i]->pubDate;
$pubDate = explode(" ", $pubDate);
$pubDate[2] = twitter_month($pubDate[2]);
$date = $pubDate[1].'.'.$pubDate[2].'.'.$pubDate[3];
$guid = $xml->channel->item[$i]->guid;
echo('<a href="'.$guid.'" title="'.$description.'" target="_blank" class="tweets"><strong><span>'.$date.'</span>'.$title.'</strong></a>');
}
}
// Editable below
$feed_link = 'http://twitter.com/statuses/user_timeline/39709745.rss';
$max_items = '5';
$max_length = '70';
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $feed_link);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
$ch2 = curl_copy_handle($ch);
$file_feed = curl_exec($ch2);
curl_close($ch2);
curl_close($ch);
} else {
// curl library is not installed so we better use something else
}
$xml = simplexml_load_string($file_feed);
$q_items = sizeof($xml->channel->item);
if($q_items < $max_items){
$max_items = $q_items;
}
for ($i = 0; $i < $max_items; $i++){
$title = $xml->channel->item[$i]->title;
$title = str_replace('nielsborn: ', '', $title);
if(strlen($title) > $max_length){
$title = substr($title, 0, $max_length);
$title .= '...';
}
$description = $xml->channel->item[$i]->description;
$description = str_replace('nielsborn: ', '', $description);
$pubDate = $xml->channel->item[$i]->pubDate;
$pubDate = explode(" ", $pubDate);
$pubDate[2] = twitter_month($pubDate[2]);
$date = $pubDate[1].'.'.$pubDate[2].'.'.$pubDate[3];
$guid = $xml->channel->item[$i]->guid;
echo('<a href="'.$guid.'" title="'.$description.'" target="_blank" class="tweets"><strong><span>'.$date.'</span>'.$title.'</strong></a>');
}
}
Voor de mensen die me hebben geholpen in deze kwestie: bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Niels