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%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.
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 Ссылка
welches mit Ihrem Regex
-basierten Ansatz ist wahrscheinlich (ungetestet) kartierbar zu:
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
.
Obwohl dies nicht die robusteste Lösung ist, sollte es die Arbeit erledigen.
%Vor%Sie könnten das HTMLAgilityPack dazu verwenden, dies zu erreichen. Sie würden etwas entlang dieser (nicht getesteten) Zeilen machen:
Hier sind ein paar Beispiele: