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