8.14. Wie ersetze ich alle relativen Links in einer HTML-Datei durch absolute?Antwort von Kerry W. LothropIn 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);
}
?>
|
||
| 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 | ||