Javascript: REGEX-zu ändern, werden alle relativen Urls zu Absoluten
Ich bin derzeit erstellen Node.js webscraper/proxy, aber ich habe Probleme beim Parsen von relativen Urls finden Sie im scripting-Teil der Quelle, ich dachte, REGEX würde den trick tun.
Obwohl es ist unbekannt, wie möchte ich dies erreichen.
Ist es trotzdem kann ich das angehen?
Auch ich bin offen, ein einfacher Weg, dies zu tun, da bin ich ganz Schallwand darüber, wie andere Proxys analysieren websites. Ich dachte, dass die meisten sind nur verherrlicht Website Schaber, die Lesen können eine Website-Quelle ein relais alle links/Formulare zurück an den proxy.
Ich würde von einem echten parser, nicht eine regex. Es gibt html-Parser-Knoten.
InformationsquelleAutor Trevor | 2011-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erweiterte HTML-Zeichenfolgen ersetzen-Funktionen
Hinweis für den OP, denn er beantragte eine solche Funktion: Ändern
base_url
zu Ihrem proxy-Basis-URL, um die gewünschten Ergebnisse zu erreichen.Beiden Funktionen werden unten angezeigt werden (die Anleitung ist enthalten in den code). Stellen Sie sicher, dass Sie nicht überspringen Sie alle ein Teil der Erklärung dieser Antwort zu verstehen, die Funktion, die das Verhalten der.
rel_to_abs(urL)
- Diese Funktion liefert absolute URLs. Wenn eine absolute URL mit einem allgemein vertrauenswürdigen Protokoll übergeben wird, es wird sofort wieder auf diese URL. Ansonsten eine absolute URL erzeugt wird von denbase_url
und die Funktion-argument. Relative URLs werden korrekt geparst (../
;./
;.
;//
).replace_all_rel_by_abs
- Diese Funktion analysiert alle vorkommen von URLs, die eine signifikante Bedeutung in HTML, wie CSSurl()
, links und externe Ressourcen. Sehen Sie den code für eine vollständige Liste der analysierten Instanzen. Sehen diese Antwort für eine angepasste Umsetzung zu desinfizieren HTML-Zeichenfolgen von einer externen Quelle (zum einbetten in das Dokument).rel_to_abs
- Analyse relative URLsFälle /Beispiele:
http://foo.bar
. Bereits eine absolute URL, also sofort zurückgegeben./doo
Relativ zum root: Gibt das aktuelle root + bereitgestellt relative URL../meh
Relativ zum aktuellen Verzeichnis.../booh
Relativ zum übergeordneten Verzeichnis.Wandelt die Funktion relative Pfade zu
../
, und führt eine Suche-und-ersetzen (http://domain/sub/anything-but-a-slash/../me
zuhttp://domain/sub/me
).replace_all_rel_by_abs
- Konvertieren alle relevanten Vorkommnisse von URLsURLs im script-Instanzen (
<script>
- , event-Handler sind nicht ersetzt, weil es beinahe unmöglich zu erstellen, ein schnell-und-sicher-filter zu analysieren JavaScript.Dieses Skript wird serviert mit einige Kommentare. Reguläre Ausdrücke dynamisch erstellt werden, da ein einzelner RE haben eine Größe von 3000 Zeichen.
<meta http-equiv=refresh content=.. >
werden kann, verschleiert in verschiedenen Arten, daher der Größe des RE.Eine kurze Zusammenfassung des privaten Funktionen:
rel_to_abs(url)
- Wandelt relative /unbekannte URLs zu absoluten URLsreplace_all_rel_by_abs(html)
- Ersetzt alle entsprechenden vorkommen von URLs in einem string der HTML-von absoluten URLs.ae
- Eineny Entity - Gibt ein RE-Muster zum Umgang mit HTML-entities.by
- ersetzen von - Diese Funktion Anforderung der aktuellen url ersetzen (rel_to_abs
). Diese Funktion kann aufgerufen werden Hunderte, wenn nicht tausend mal. Seien Sie vorsichtig, um nicht einen langsamen Algorithmus, um diese Funktion (Anpassung).cr
- Create Replace - Erstellt und führt eine Suche-und-ersetzen.Beispiel:
href="..."
(in einem HTML-tag).cri
- Create Replace ichnline - Erstellt und führt eine Suche-und-ersetzen.Beispiel:
url(..)
im Rahmen des all -style
- Attribut in HTML-tags.Testfall
Jeder Seite zu öffnen, und fügen Sie das folgende bookmarklet in der Adressleiste:
Den eingefügten code enthält zwei Funktionen, wie Sie oben definiert sind, plus die test-Fall, siehe unten. Hinweis: Der Testfall wird nicht ändern Sie die HTML der Seite, sondern zeigt die analysierten Ergebnisse in einem Textbereich (Optional).
Siehe auch:
Meine Funktion in Ihrem code, und rufen Sie
rel_to_abs
Wann immer Sie wollen zu bekommen eine absolute URL, die von einer möglicherweise relative URL, zB:var some_url = ".././callback/xhr.php";rel_to_abs(some_url)
;Ja, ich verstehe. Aber ich meinte, wie würde ich mich in der Lage zu Scannen, durch die Seite bin ich proxying, um zu finden, die diese urls?
Nein. Und ich würde Sie nicht benutzen. Vor 4 Jahren war ich glücklich das schreiben kompliziert regexes zu Parsen von URLs, aber jetzt empfehle ich die Nutzung eigener URL-Parser oder DOM-Parser (alle modernen Browser haben diese Funktionen in diesen Tagen). Wenn Sie Node.js verwenden Sie die
url
Modul. Wenn Sie verwenden Browser, dieURL
Konstruktor,document.createElement('a')
oder jeder anderen url-Bibliothek.Wenn das Ergebnis wird als HTML-Seite, setzen Sie einfach einen
<base>
- tag im HTML-und dann brauchen Sie nicht zu analysieren, die Seite an alle (und es wird auch für externe Ressourcen). Ansonsten können Sie erstellen ein Dokument mit demDOMParser
API, und dann durchqueren Sie das Dokument Struktur und ersetzen Sie alles, was Sie über Pflege (z.B. text-nodes, HTML-Attribute, style-sheets, ...).InformationsquelleAutor Rob W
Einen zuverlässigen Weg, um konvertieren von urls in relative, absolute, ist die Verwendung der integrierten
url
- Modul.Beispiel:
die Frage war über ein Node.js -Anwendung.
require()
ist die Node.js äquivalent C#include <...>
. (Naja, nicht ganz.) Also, meine Antwort kann nicht verwendet werden beim schreiben von JS-code für die Ausführung im Browser.InformationsquelleAutor tuomassalo
Aus einem Kommentar von Rob-W-oben über den base-tag schrieb ich eine Spritze Funktion:
InformationsquelleAutor Geordie
Wenn Sie ein regex-zu finden, alle nicht-absoluten URLs können Sie dann nur prefix diese mit den aktuellen URL und das sollte es gewesen sein.
URLs, die Sie beheben müssen würde solche sein, die nicht starten, entweder mit einem
/
oderhttp(s)://
(oder einem anderen Protokoll-Marker, wenn Sie sich sorgen über Sie)Als ein Beispiel, sagen wir, du bist Schaben
http://www.example.com/
. Wenn Sie auch eine relative URL, sagen wir malfoo/bar
, Sie würde einfach das Präfix der URL wird abgeschabt, um es so auf:http://www.example.com/foo/bar
Für eine regex zu kratzen, die URLs von der Seite, es gibt wahrscheinlich viele gute zur Verfügung, wenn Sie google ein wenig, so dass ich werde nicht beginnen, die Erfindung eines Armen hier 🙂
InformationsquelleAutor Jani Hartikainen