de.comp.lang.php FAQ

8.14. Wie ersetze ich alle relativen Links in einer HTML-Datei durch absolute?

Keywords: Hyperlink | relativ | absolut

Antwort von Kerry W. Lothrop

In diesem Beispiel wird die HTML-Datei über den file() -Befehl vom entfernten Server gezogen. Die Funktion absolute() erwartet als ersten Parameter einen Link und als zweiten Parameter die volle URL des Dokuments, in dem sich der Link befindet. Sie kann auch in einem anderen Kontext verwendet werden. Obwohl viele der Anweisungen (z.B. substr() oder strrpos() ) auch über reguläre Ausdrücke gelöst werden können, wurde aus Performance-Gründen bewusst darauf verzichtet.

<?php
// Datei über HTTP aufrufen
$url = 'http://www.server.de/test.html';
$old = implode('', file($url));

// Links suchen und an absolute() weiterleiten
$new = preg_replace(',<a([^>]+)href="([^>"\s]+)",ie',
    '"<a\1href=\"" . absolute("\2", $url) . "\""',
    $old);

// HTML-Code ausgeben
header('Content-type: text/plain');
echo $new;

// Funktion, die relative in absolute Links umschreibt
function absolute ($relative, $absolute) {

    // Link ist schon absolut
    if (preg_match(',^(https?://|ftp://|mailto:|news:),i', $relative))
        return $relative;

    // parse_url() nimmt die URL auseinander
    $url = parse_url($absolute);
    
    // dirname() erkennt auf / endende URLs nicht
    if ($url['path']{strlen($url['path']) - 1} == '/')
        $dir = substr($url['path'], 0, strlen($url['path']) - 1);
    else
        $dir = dirname($url['path']);

    // absoluter Link auf dem gleichen Server
    if ($relative{0} == '/') {
        $relative = substr($relative, 1);
        $dir = '';
    }

    // Link fängt mit ./ an
    elseif (substr($relative, 0, 2) == './')
        $relative = substr($relative, 2);

    // Referenzen auf höher liegende Verzeichnisse auflösen
    else while (substr($relative, 0, 3) == '../') {
        $relative = substr($relative, 3);
        $dir = substr($dir, 0, strrpos($dir, '/'));
    }

    // volle URL zurückgeben
    return sprintf('%s://%s%s/%s', $url['scheme'], $url['host'], $dir, $relative);
}
?>
hosted by
schlund + partner

Valid HTML 4.01! Valid CSS!

8.14. Wie ersetze ich alle relativen Links in einer HTML-Datei durch absolute?
http://www.dclp-faq.de/q/q-regexp-links-absolut.html
de.comp.lang.php FAQ | (c) Copyright 2000-2003 Das dclp-FAQ-Team