Enkel RSS-läsare för Placera.se med rengöring av XML-innehåll i PHP
<?php
/**
* Enkel RSS-läsare för Placera.se med rengöring av XML-innehåll.
* Hämtar RSS från https://placera.se/artiklar/rss.xml, tar bort oönskade tecken och HTML-taggar
* för att ge en ren och säker HTML-utmating.
*/
// 1) Slå på felrapportering
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 2) Kontrollera att allow_url_fopen är aktiverat
if (!ini_get('allow_url_fopen')) {
die("Fel: allow_url_fopen är avstängt. Sätt allow_url_fopen = On i php.ini och starta om webbservern.");
}
// 3) RSS-URL
$rssUrl = 'https://placera.se/artiklar/rss.xml';
// 4) Hämta rå RSS-text
$rssContent = @file_get_contents($rssUrl);
if ($rssContent === false) {
$err = error_get_last();
die("Kunde inte läsa från $rssUrl. Fel: " . ($err['message'] ?? 'Okänt fel'));
}
// 5) Rengör rå-XML: ta bort kontrolltecken och ogiltiga UTF-8-sekvenser
// a) Ta bort ASCII-kontrolltecken utom ny rad/tabb/retur
$rssContent = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $rssContent);
// b) Konvertera till UTF-8 och ta bort ogiltiga sekvenser
$rssContent = mb_convert_encoding($rssContent, 'UTF-8', 'UTF-8');
// 6) Extrahera alla <item>…</item> block med regex
if (!preg_match_all('/<item\b[^>]*>(.*?)<\/item>/is', $rssContent, $matches)) {
die("Hittade inga <item> i RSS-flödet.");
}
$itemBlocks = $matches[1];
/**
* Funktion för att rengöra och plocka ut texten innanför en given tagg.
* Tar bort HTML-taggar, CDATA-markeringar och överflödiga mellanslag.
*/
function extractAndClean(string $tagName, string $text): string {
// 1) Extrahera innehållet mellan <tag> och </tag>
$pattern = sprintf('/<%1$s\b[^>]*>(.*?)<\/%1$s>/is', preg_quote($tagName, '/'));
if (!preg_match($pattern, $text, $m)) {
return '';
}
$inner = $m[1];
`// 2) Ta bort CDATA-markering om den finns`
`$inner = preg_replace('/<!\[CDATA\[(.*?)\]\]>/is', '$1', $inner);`
`// 3) Rensa bort alla HTML-taggar`
`$inner = strip_tags($inner);`
`// 4) Avkoda HTML-entiteter`
`$inner = html_entity_decode($inner, ENT_QUOTES | ENT_HTML5, 'UTF-8');`
`// 5) Trimma överflödiga mellanslag och ny rad i början/slutet`
`$inner = trim($inner);`
`// 6) Ta bort flera blanksteg och radbrytningar i rad`
`$inner = preg_replace('/[ \t]{2,}/', ' ', $inner);`
`$inner = preg_replace('/\r?\n\s*/', "\n", $inner);`
`return $inner;`
}
// 7) Förbered HTML-svar
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="UTF-8">
<title>Placera.se RSS (rengjort)</title>
<style>
body { font-family: sans-serif; margin: 20px; }
h1 { font-size: 1.5em; margin-bottom: 1rem; }
ul { list-style: none; padding: 0; }
li { margin-bottom: 1.5rem; }
a { text-decoration: none; color: #006699; }
a:hover { text-decoration: underline; }
.date { color: #666; font-size: 0.9em; margin-top: 0.25rem; }
.desc { margin-top: 0.5rem; color: #333; white-space: pre-wrap; }
</style>
</head>
<body>
<h1>Senaste artiklar från Placera.se (rengjort)</h1>
<ul>
<?php foreach ($itemBlocks as $block): ?>
<?php
$titleRaw = extractAndClean('title', $block);
$linkRaw = extractAndClean('link', $block);
$dateRaw = extractAndClean('pubDate', $block);
$descRaw = extractAndClean('description', $block);
// Formatera datum om möjligt
$pubDate = '';
if ($dateRaw !== '') {
$ts = strtotime($dateRaw);
$pubDate = ($ts !== false) ? date('Y-m-d H:i', $ts) : $dateRaw;
}
?>
<li>
<?php if ($linkRaw !== ''): ?>
<a href="<?php echo htmlspecialchars($linkRaw, ENT_QUOTES); ?>" target="_blank">
<?php echo htmlspecialchars($titleRaw, ENT_QUOTES); ?>
</a>
<?php else: ?>
<?php echo htmlspecialchars($titleRaw, ENT_QUOTES); ?>
<?php endif; ?>
<?php if ($pubDate !== ''): ?>
<div class="date">Publicerad: <?php echo htmlspecialchars($pubDate, ENT_QUOTES); ?></div>
<?php endif; ?>
<?php if ($descRaw !== ''): ?>
<div class="desc"><?php echo htmlspecialchars($descRaw, ENT_QUOTES); ?></div>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>