C # Relativ zu absoluten Links in HTML String konvertieren

8

Ich spiegle einige interne Websites für Sicherungszwecke. Im Moment verwende ich im Grunde diesen c # -Code:

%Vor%

Das lädt im Grunde nur den HTML-Code in ein Byte-Array herunter. Das ist was ich will. Das Problem ist jedoch, dass die Links innerhalb des HTML-Codes relativ oft und nicht absolut sind.

Ich möchte grundsätzlich die gesamte Datei vor dem relativen Link anhängen, um sie in einen absoluten Link zu konvertieren, der zum ursprünglichen Inhalt umleitet. Ich bin im Grunde nur besorgt mit href = und src =. Gibt es einen Regex-Ausdruck, der einige der grundlegenden Fälle abdecken wird?

Bearbeiten [Mein Versuch]:

%Vor%     
Gary 01.10.2010, 04:58
quelle

10 Antworten

8

Die stabilste Lösung wäre, das HTMLAgilityPack zu verwenden, wie andere vorgeschlagen haben. Eine vernünftige Lösung, die reguläre Ausdrücke verwendet, ist jedoch mit der Ersetzung Überladung möglich, die ein MatchEvaluator Delegat wie folgt:

%Vor%

Das obige Beispiel sucht nach Attributen mit den Namen src und href, die doppelt zitierte Werte enthalten, die mit einem Schrägstrich beginnen. Für jede Übereinstimmung wird die statische Methode Uri.TryCreate verwendet, um festzustellen, ob der Wert gültig ist relative uri.

Beachten Sie, dass diese Lösung keine einzelnen in Anführungszeichen gesetzten Attributwerte verarbeitet und sicherlich nicht für schlecht formatiertes HTML mit nicht angegebenen Werten funktioniert.

    
Nathan Baulch 01.10.2010, 05:54
quelle
5

Sie sollten das HtmlAgility-Paket verwenden, um den HTML-Code zu laden, auf alle ihn verwendenden hrefs zuzugreifen und dann die Uri-Klasse zu verwenden, um bei Bedarf von relativ zu absolut zu konvertieren.

Siehe zum Beispiel Ссылка

    
Ian Mercer 01.10.2010 05:37
quelle
5
%Vor%

welches mit Ihrem Regex -basierten Ansatz ist wahrscheinlich (ungetestet) kartierbar zu:

%Vor%

Ich sollte auch nicht empfehlen, Regex hier zu verwenden, aber den Uri-Trick auf Code mit einem DOM, vielleicht XmlDocument (wenn xhtml) oder dem HTML Agility Pack anzuwenden (ansonsten ), mit Blick auf alle Attribute //@src oder //@href .

    
Marc Gravell 01.10.2010 08:26
quelle
1

Obwohl dies nicht die robusteste Lösung ist, sollte es die Arbeit erledigen.

%Vor%     
Matthew Manela 01.10.2010 05:32
quelle
1

Sie könnten das HTMLAgilityPack dazu verwenden, dies zu erreichen. Sie würden etwas entlang dieser (nicht getesteten) Zeilen machen:

  • Laden Sie die URL
  • Wählen Sie alle Links
  • aus
  • Laden Sie den Link in ein Uri und testen Sie, ob es relativ ist relativ konvertiert es in absolute
  • Aktualisieren Sie den Wert der Verknüpfung mit dem neuen Wert uri
  • speichern Sie die Datei

Hier sind ein paar Beispiele:

Relativ zu absoluten Pfaden in HTML (asp.net)

Ссылка

Ссылка

    
Garett 01.10.2010 05:40
quelle
0

Ich denke, URL ist vom Typ String. Verwenden Sie stattdessen Uri mit einem Basis-URI, das auf Ihre Domäne verweist:

%Vor%     
Yogesh 01.10.2010 05:23
quelle
0

Benutze einfach diese Funktion

%Vor%     
Smith 20.08.2011 21:20
quelle
0

Einfache Funktion

%Vor%     
Samidjo 02.02.2012 11:35
quelle
0

Ich weiß, das ist eine ältere Frage, aber ich habe herausgefunden, wie man das mit einer ziemlich einfachen Regex macht. Es funktioniert gut für mich. Es behandelt http / https sowie root-relatives und aktuelles Verzeichnis-relativ.

%Vor%     
jfren484 28.11.2012 18:22
quelle
0

das ist, was Sie suchen, dieses Code-Snippet kann alle relativen URLs in jedem HTML-Code absolut konvertieren:

%Vor%     
Ouday 20.02.2014 20:02
quelle

Tags und Links