Angabe der URL (einzeilig):
http://test.example.com/dir/subdir/file.html
Wie kann ich die folgenden Teile mit regulären Ausdrücken extrahieren:
- Die Subdomain (Test)
- Die Domain (example.com)
- Der Pfad ohne die Datei (/ dir / subdir /)
- Die Datei (file.html)
- Der Pfad mit der Datei (/dir/subdir/file.html)
- Die URL ohne Pfad ( http://test.example.com )
- (Fügen Sie alle anderen hinzu, die Sie für nützlich halten.)
Die Regex sollte auch dann korrekt funktionieren, wenn ich die folgende URL eingebe:
http://example.example.com/example/example/example.html
CrackUrl
. Wenn eine solche Funktion vorhanden ist, verwenden Sie sie. Es ist fast garantiert, dass sie zuverlässiger und effizienter ist als jeder handgefertigte Code.Antworten:
Sie können dann den Host ('.' begrenzt) ganz einfach weiter analysieren.
Was ich tun würde, ist so etwas zu verwenden:
die weitere Analyse "der Rest", um so spezifisch wie möglich zu sein. Es ist ein bisschen verrückt, es in einem regulären Ausdruck zu machen.
quelle
(.*)?
Da der Kleene-Stern bereits 0 oder mehr akzeptiert,?
verwirrt ihn der Teil (0 oder 1). Ich habe es behoben, indem ich zu gewechselt(.*)?
habe(.+)?
. Sie können auch einfach die?
http://www.example.com:8080/....
Here goes zu extrahieren :^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
Mir ist klar, dass ich zu spät zur Party komme, aber es gibt eine einfache Möglichkeit, den Browser eine URL ohne Regex für Sie analysieren zu lassen:
quelle
http://
Eigenschaften von Protokoll, Host und Hostname korrekt anzuzeigen. Andernfalls geht der Beginn der URL bis zum ersten Schrägstrich zur Protokolleigenschaft.var url = new URL(someUrl)
Ich bin ein paar Jahre zu spät zur Party, aber ich bin überrascht, dass niemand erwähnt hat, dass die Uniform Resource Identifier-Spezifikation einen Abschnitt zum Parsen von URIs mit einem regulären Ausdruck enthält . Der reguläre Ausdruck von Berners-Lee et al. Lautet:
Für das, was es wert ist, fand ich, dass ich den Schrägstrichen in JavaScript entkommen musste:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
quelle
1
Dies behandelt andere Protokolle wieftp://
und korrektmailto://
.2
: Dies geht richtig mitusername
und umpassword
. Diese optionalen Felder sind wie Hostname und Port durch einen Doppelpunkt getrennt und lösen die meisten anderen regulären Ausdrücke aus, die ich gesehen habe. @ RémyDAVID Der Querystring wird auch vom Browserobjekt nicht normal analysiertlocation
. Wenn Sie die Abfragezeichenfolge analysieren müssen, schauen Sie sich dazu meine winzige Bibliothek an: uqs .user:[email protected]
- RFC 3986 sagt:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Ich fand, dass die Antwort mit der höchsten Stimme (die Antwort von Hometoast) für mich nicht perfekt funktioniert. Zwei Probleme:
Das Folgende ist eine modifizierte Version:
Die Position der Teile ist wie folgt:
Bearbeiten gepostet von einem Benutzer:
quelle
http://www.example.com
oder wenn der Pfad ein einzelnes Zeichen wie isthttp://www.example.com/a
.Ich brauchte einen regulären Ausdruck, der mit allen URLs übereinstimmt, und habe diesen erstellt:
Es stimmt mit allen URLs, jedem Protokoll und sogar mit URLs überein
Das Ergebnis (in JavaScript) sieht folgendermaßen aus:
Eine URL wie
sieht aus wie das:
quelle
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Ich habe versucht, dies in Javascript zu lösen, das behandelt werden sollte von:
da (zumindest in Chrome) Folgendes analysiert wird:
Dies ist jedoch kein Cross-Browser ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), daher habe ich dies zusammengeschustert, um die gleichen Teile wie oben herauszuziehen:
Die Gutschrift für diesen regulären Ausdruck geht an https://gist.github.com/rpflorence , der diesen jsperf http://jsperf.com/url-parsing gepostet hat (ursprünglich hier gefunden: https://gist.github.com/jlong/2428561 # comment-310066 ), der den regulären Ausdruck gefunden hat , auf dem dieser ursprünglich basiert.
Die Teile sind in dieser Reihenfolge:
Es gibt auch eine kleine Bibliothek, die es umschließt und Abfrageparameter bereitstellt:
https://github.com/sadams/lite-url (auch auf Laube erhältlich)
Wenn Sie eine Verbesserung haben, erstellen Sie bitte eine Pull-Anfrage mit weiteren Tests, und ich werde sie akzeptieren und mit Dank zusammenführen.
quelle
http://test1.dev.mydomain.com/
zum Beispiel hätte, würde es herausziehentest1.dev.
.Schlagen Sie eine viel besser lesbare Lösung vor (in Python, gilt jedoch für alle regulären Ausdrücke):
Drucke:
quelle
Subdomain und Domain sind schwierig, da die Subdomain aus mehreren Teilen bestehen kann, ebenso wie die Top-Level-Domain http://sub1.sub2.domain.co.uk/
(Markdown ist nicht sehr freundlich zu Regexen)
quelle
(http(s?)://[^/]+/)
um auch httpsDiese verbesserte Version sollte so zuverlässig wie ein Parser funktionieren.
quelle
Versuche Folgendes:
Es unterstützt HTTP / FTP, Subdomains, Ordner, Dateien usw.
Ich habe es über eine schnelle Google-Suche gefunden:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
quelle
Aus meiner Antwort auf eine ähnliche Frage . Funktioniert besser als einige der anderen genannten, da sie einige Fehler aufwiesen (z. B. keine Unterstützung von Benutzername / Passwort, keine Unterstützung von Dateinamen mit einem Zeichen, fehlerhafte Fragment-IDs).
quelle
Sie können alle http / https, Host, Port, Pfad sowie Abfragen mithilfe des Uri-Objekts in .NET abrufen. Die schwierige Aufgabe besteht darin, den Host in Subdomain, Domainname und TLD zu unterteilen.
Es gibt keinen Standard dafür und kann nicht einfach String-Parsing oder RegEx verwenden, um das richtige Ergebnis zu erzielen. Zuerst verwende ich die RegEx-Funktion, aber nicht alle URLs können die Subdomain korrekt analysieren. Die Übungsmethode besteht darin, eine Liste von TLDs zu verwenden. Nachdem eine TLD für eine URL definiert wurde, ist der linke Teil die Domäne und der Rest die Unterdomäne.
Die Liste muss jedoch beibehalten werden, da neue TLDs möglich sind. Der aktuelle Moment, den ich kenne, ist, dass publicsuffix.org die neueste Liste verwaltet. Sie können Domainname-Parser-Tools aus Google Code verwenden, um die öffentliche Suffixliste zu analysieren und die Subdomain, Domain und TLD mithilfe des DomainName-Objekts: domainName.SubDomain, domainName einfach abzurufen .Domain und domainName.TLD.
Dies beantwortet auch hilfreiche Fragen: Holen Sie sich die Subdomain von einer URL
CaLLMeLaNN
quelle
Hier ist eine, die vollständig ist und sich nicht auf ein Protokoll stützt.
Druckt
quelle
Keines der oben genannten hat bei mir funktioniert. Folgendes habe ich letztendlich verwendet:
quelle
Ich mag den regulären Ausdruck, der in "Javascript: The Good Parts" veröffentlicht wurde. Es ist nicht zu kurz und nicht zu komplex. Diese Seite auf Github enthält auch den JavaScript-Code, der sie verwendet. Aber es kann für jede Sprache angepasst werden. https://gist.github.com/voodooGQ/4057330
quelle
Java bietet eine URL-Klasse an, die dies erledigt. URL-Objekte abfragen.
Nebenbei bemerkt bietet PHP parse_url () .
quelle
Ich würde empfehlen, keinen regulären Ausdruck zu verwenden. Ein API-Aufruf wie WinHttpCrackUrl () ist weniger fehleranfällig.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
quelle
Ich habe einige davon ausprobiert, die meine Bedürfnisse nicht abdeckten, insbesondere die am höchsten bewerteten, die keine URL ohne Pfad abfingen ( http://example.com/ ).
Auch das Fehlen von Gruppennamen machte es in Ansible unbrauchbar (oder vielleicht fehlen meine jinja2-Fähigkeiten).
Dies ist also meine Version, die leicht modifiziert wurde, wobei die Quelle hier die Version mit der höchsten Bewertung ist:
quelle
Die Verwendung von http://www.fileformat.info/tool/regex.htm Hometoasts Regex funktioniert hervorragend.
Aber hier ist der Deal, ich möchte verschiedene Regex-Muster in verschiedenen Situationen in meinem Programm verwenden.
Zum Beispiel habe ich diese URL und eine Aufzählung, die alle unterstützten URLs in meinem Programm auflistet. Jedes Objekt in der Aufzählung verfügt über eine Methode getRegexPattern, die das Regex-Muster zurückgibt, das dann zum Vergleich mit einer URL verwendet wird. Wenn das bestimmte Regex-Muster true zurückgibt, weiß ich, dass diese URL von meinem Programm unterstützt wird. Daher hat jede Aufzählung einen eigenen regulären Ausdruck, je nachdem, wo sie in der URL angezeigt werden soll.
Der Vorschlag von Hometoast ist großartig, aber in meinem Fall würde er meiner Meinung nach nicht helfen (es sei denn, ich kopiere und füge den gleichen regulären Ausdruck in alle Aufzählungen ein).
Deshalb wollte ich, dass die Antwort den regulären Ausdruck für jede Situation separat angibt. Obwohl +1 für Hometoast. ;)
quelle
Ich weiß, dass Sie diesbezüglich sprachunabhängig sind, aber können Sie uns sagen, was Sie verwenden, damit wir wissen, über welche Regex-Funktionen Sie verfügen?
Wenn Sie die Möglichkeit haben, Übereinstimmungen nicht zu erfassen, können Sie den Ausdruck von hometoast so ändern, dass Unterausdrücke, an deren Erfassung Sie nicht interessiert sind, wie folgt eingerichtet werden:
(?:SOMESTUFF)
Sie müssten den Regex immer noch kopieren und an mehreren Stellen einfügen (und leicht ändern), aber dies ist sinnvoll. Sie überprüfen nicht nur, ob der Unterausdruck vorhanden ist, sondern ob er als Teil einer URL vorhanden ist . Wenn Sie den Modifikator "Nicht erfassen" für Unterausdrücke verwenden, erhalten Sie das, was Sie benötigen, und nichts weiter. Wenn ich Sie richtig lese, ist dies genau das, was Sie möchten.
Genau wie eine kleine, kleine Notiz muss Hometoasts Ausdruck keine Klammern um das 's' für 'https' setzen, da er nur ein Zeichen enthält. Quantifizierer quantifizieren das eine Zeichen (oder die Zeichenklasse oder den Unterausdruck) direkt vor ihnen. So:
https?
würde gut mit 'http' oder 'https' übereinstimmen.
quelle
regexp, um den URL-Pfad ohne die Datei zu erhalten.
url = ' http: // domain / dir1 / dir2 / somefile ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /)) ? /? (?: [^ /] +)? $ / i) .to_s
Dies kann nützlich sein, um dieser URL einen relativen Pfad hinzuzufügen.
quelle
Die Regex für das vollständige Parsen ist ziemlich schrecklich. Ich habe aus Gründen der Lesbarkeit benannte Rückreferenzen eingefügt und jedes Teil in separate Zeilen unterteilt, aber es sieht immer noch so aus:
Die Sache, die es erfordert, dass es so ausführlich ist, ist, dass außer dem Protokoll oder dem Port jeder der Teile HTML-Entitäten enthalten kann, was die Abgrenzung des Fragments ziemlich schwierig macht. In den letzten Fällen - Host, Pfad, Datei, Querystring und Fragment - erlauben wir entweder jede HTML-Entität oder jedes Zeichen, das kein
?
oder ist#
. Der reguläre Ausdruck für eine HTML-Entität sieht folgendermaßen aus:Wenn das extrahiert wird (ich habe eine Schnurrbart-Syntax verwendet, um es darzustellen), wird es ein bisschen besser lesbar:
In JavaScript können Sie natürlich keine benannten Rückreferenzen verwenden, daher wird der reguläre Ausdruck
und in jeder Übereinstimmung ist das Protokoll
\1
, der Host ist\2
, der Port ist\3
, der Pfad\4
, die Datei\5
, der Querystring\6
und das Fragment\7
.quelle
quelle
Ich habe diesen regulären Ausdruck zum Parsen von URL-Partitionen ausprobiert:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Streichhölzer:
quelle
Bietet die folgende Ausgabe:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Wenn Sie die URL in
String s = " https: //www.thomas ändern -bayer.com?wsdl=qwerwer&ttt=888 "; Die Ausgabe lautet wie folgt:
1: https: //
2: www.thomas-bayer.com
3 :?
4: wsdl = qwerwer & ttt = 888
genießen ..
Yosi Lev
quelle