2016-05-27 15 views
0

Ich versuche, eine Regex für die Validierung von URLs zu erstellen. Ich weiß, dass es viele Fortgeschrittene gibt, aber ich möchte meine eigenen für Lernzwecke erstellen.Finde das letzte Vorkommen von Punkt mit Regex

Bisher habe ich eine Regex, die recht gut funktioniert, aber ich möchte die Validierung für den TLD-Teil der URI verbessern, weil ich denke, dass es noch nicht ganz da ist.

Hier ist mein regex (oder auf regexr finden):

/^[(http(s)?):\/\/(www\.)[email protected]:._\+~#=]{2,256}\.[a-zA-Z]{2,6}\b([/#?]{0,1}([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)$/ 

Es funktioniert gut für Links wie foo.com oder http://foo.com oder foo.co.uk

Das Problem erscheint, wenn Sie Sub-Domains oder Second-Level-Domains einführen wie co.uk, weil der Regex foo.co.u oder foo.co. akzeptiert.

Ich habe versucht die folgenden mit der Teilkette nach dem letzten . auszuwählen:

/[(http(s)?):\/\/(www\.)[email protected]:._\+~#=]{2,256}[^.]{2,}$/ 

aber das hindert mich daran, die Definition der path Regeln der URI.

Wie kann ich sicherstellen, dass der Teil nach den letzten . aber vor den ersten /, ? oder # mindestens 2 Zeichen lang ist?

+0

Wenn Sie lernen wollen, warum fragen Sie uns? Nimm einen der Fortgeschrittenen und analysiere ihn. ;) – ClasG

+0

Wie wäre es nur mit '\. \ W {2,} $'? Es wird überprüft, ob es nach dem letzten '.' mit mindestens 2 Zeichen endet. – ClasG

+0

@ClasG Die fortgeschrittenen sind Tausende von Zeichen lang. :) Ihre Regex funktioniert nicht ganz, wenn Sie einen Pfad in der URL haben (z. B. 'foo.co.uk/test? Id = 1') – Chris

Antwort

1

Von dem, was ich sehen kann, sind Sie fast da. Einige Änderungen vorgenommen und es scheint zu funktionieren.

^(http(s)?:\/\/)?(www\.)?[[email protected]:._\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$ 

Kann etwas, indem Sie

^(http(s)?:\/\/)?(www\.)?[\[email protected]:.\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([-\w.~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$ 

Der wesentliche Unterschied besteht darin, dass der Parameterteil optional ist, aber wenn es da ist es (im Grunde nur Ihre regex gezwickt) verkürzt werden muss mit einem von /#?; beginnen. Dieser Teil könnte wahrscheinlich auch vereinfacht werden.

Check it out here.

Edit:

Nach einigem Experimentieren ich denke, das ungefähr so ​​einfach ist, es wird erhalten:

^(http(?:s)?:\/\/)?([-.~\w]+\.[a-zA-Z]{2,6})(:\d+)?(\/[-.~\w]*)?([@/#?;].*)?$ 

Es erfasst auch die einzelnen Teile - Schema, Host, Port, Pfad und Abfrage/Parameter.

Example here.

+0

Scheint wirklich gut zu funktionieren! Vielen Dank. – Chris

+0

Ich denke, Sie könnten sogar mit diesem einen guten: '^ (http (s)?: \/\ /)? (www \.)? [\ w @:. \ + ~ =] {2,256} \. [a-zA-Z] {2,6} \ /? ([# ?;] . *)? $ '. Es erlaubt alles nach einem optionalen * URL-Terminator *. – ClasG

+0

Erlaubt keinen Pfad, wie es scheint, zB: 'foo.com/path' – Chris

Verwandte Themen