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);
}
?>

Valid HTML 4.01! Valid CSS!

8.14. Wie ersetze ich alle relativen Links in einer HTML-Datei durch absolute?
http://www.php-faq.de/q/q-regexp-links-absolut.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team