Webit.one - From idea to action

Publicerad: 2025-06-02 18:22:31

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>
Publicerad: 2025-05-31 10:52:04
What's working:
  • GPU Acceleration with NootedRed
  • Keyboard with VoodooPS2
  • Backlight with PNLF.aml
  • Booting it up with GenericUSBXHCI
  • Battery readouts with SMCBatteryManager
  • Brightness keys with BrightnessKeys
  • WiFi with AirportItlwm
  • Admin