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 |