Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln? (https://www.delphipraxis.net/173981-relative-referenzen-html-quellcode-absolute-referenzen-umwandeln.html)

PeterPanino 27. Mär 2013 01:16

Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln?
 
Hallo! Ich habe von einem Webserver den Quellcode einer Webseite geholt und möchte darin alle relativen Referenzen in Linkattributen (href, src, ...) in absolute Referenzen umwandeln. Die lokal geöffnete HTML-Datei soll somit gleich aussehen (Bilder, Javascript, ...), wie wenn sie online vom Webserver geladen würde. Gibt es für diese Konvertierung schon fertige Bibliotheken für Delphi oder muss ich das alles selbst parsen und konvertieren?

Volker Z. 27. Mär 2013 05:27

AW: Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln?
 
Hallo,

es würde sich RegEx anbieten.

Delphi-Quellcode:
uses
   System.RegularExpressionsCore;

function RelativeToAbsolute (const Html, Path, Pattern : string) : string;
var
  r : TPerlRegEx;
begin
   r := TPerlRegEx.Create;
  try
    r.Subject    := UTF8Encode (Html);
    r.Options    := [preCaseLess];
    r.RegEx      := Pattern;
    r.Replacement := UTF8string (Path);
    r.ReplaceAll;

    Result := string (r.Subject)
  finally
    FreeAndNil (r)
  end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Text := RelativeToAbsolute (Memo1.Text, '="www.mywebsite.de/', '="\.+\/?');
end;
würde ./, ../ oder belibig viele Punkte gefolgt von einen Slash ersetzen - sofern die Bedingung =".[.]/ erfüllt ist - mit ="www.mywebsite.de/[...].
Beispiel:
  • aus <a href="../test.htm">Linktext</a> würde <a href="www.mywebsite.de/test.htm">Linktext</a>
  • aus <img src="../test.jpg"> würde <img src="www.mywebsite.de/test.jpg">
  • hingegen bliebe <a href="../../test.htm">Linktext</a> unverändert, passt es doch nicht auf das Suchmuster

Wenn Deine relativen Pfad variieren, dann müsstest Du das nur entsprechend im Suchmuster entsprechend abbilden und es sollte es tun.

Namenloser 27. Mär 2013 07:37

AW: Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln?
 
Da gibt es aber noch sehr viel mehr zu beachten. Z.B. kann vor und nach dem = Whitespace kommen, statt " können ' verwendet werden, oder die Attribute könne sogar in einer anderen Reihenfolge stehen, z.B. <a rel="nofollow" href="...">. Außerdem muss man bei sowas unbedingt non-greedy matchen! (Kann man auch, indem man im Regex statt . [^"] schreibt).

Je nachdem, was du erreichen willst, könnte eine sehr viel einfachere und robustere Lösung darin bestehen, einfach ganz oben folgendes in den <head>-Bereich einzufügen: <base href="http://example.com/" />

PeterPanino 27. Mär 2013 09:19

AW: Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln?
 
Zitat:

Zitat von NamenLozer (Beitrag 1209054)
Da gibt es aber noch sehr viel mehr zu beachten. Z.B. kann vor und nach dem = Whitespace kommen, statt " können ' verwendet werden, oder die Attribute könne sogar in einer anderen Reihenfolge stehen, z.B. <a rel="nofollow" href="...">. Außerdem muss man bei sowas unbedingt non-greedy matchen! (Kann man auch, indem man im Regex statt . [^"] schreibt).

Je nachdem, was du erreichen willst, könnte eine sehr viel einfachere und robustere Lösung darin bestehen, einfach ganz oben folgendes in den <head>-Bereich einzufügen: <base href="http://example.com/" />

Dieser Tipp (<base href="http://example.com/" />) ist absolut genial, weil er einfach ist und alles abdeckt! Absolute Referenzen im HTML-Quellcode werden davon nicht berührt, nur relative Referenzen werden konvertiert! Vielen Dank!!!

PeterPanino 27. Mär 2013 10:38

AW: Relative Referenzen in HTML-Quellcode in absolute Referenzen umwandeln?
 
Da anscheinend IE6 (als offenbar einzige Browserversion) Probleme mit dem base-Tag hat, sollte man diesen evtl. mit einem conditional comment ergänzen:

<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz