2008-08-27 19 views
14

Wie erzeugen Sie eine Regex, die nur mit einem gültigen URI übereinstimmt? Die Beschreibung für URIs finden Sie hier: http://en.wikipedia.org/wiki/URI_scheme. Es muss keine Teile extrahieren, sondern nur testen, ob ein URI gültig ist.Regex zum Überprüfen von URIs

(bevorzugtes Format ist .Net RegulaererAusdruck) (.Net Version 1,1)

  • Hat neet nicht für ein bekanntes Protokoll zu überprüfen, nur eine gültigen.

Aktuelle Lösung:

^([a-zA-Z0-9+.-]+):(//([a-zA-Z0-9-._~!$&'()*+,;=:]*)@)?([a-zA-Z0-9-._~!$&'()*+,;=]+)(:(\\d*))?(/?[a-zA-Z0-9-._~!$&'()*+,;=:/]+)?(\\?[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?(#[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?$(:(\\d*))?(/?[a-zA-Z0-9-._~!$&'()*+,;=:/]+)?(\?[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?(\#[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?$ 

Antwort

9

Diese Seite sieht vielversprechend aus: http://snipplr.com/view/6889/regular-expressions-for-uri-validationparsing/

Sie schlagen vor, folgende regex:

/^([a-z0-9+.-]+):(?://(?:((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*)@)?((?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*)(?::(\d*))?(/(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?|(/?(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})+(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*))?$/i 
+0

Ich habe diesen Trick in PHP verwendet. Für PHP-Programmierer, siehe hier: https://stackoverflow.com/questions/206059/php-validation-regex-for-url –

1

gibt es einige spezifische URIs Sie kümmern uns um oder versuchen Sie eine einzelne Regex zu finden, die STD66 validiert?

Ich wollte Sie auf this regex für die Analyse eines URI zeigen. Sie könnten dann theoretisch prüfen, ob alle Elemente, die Ihnen wichtig sind, vorhanden sind.

Aber ich denke bdukes Antwort ist besser.

23

Funktioniert Uri.IsWellFormedUriString für Sie?

+0

+1 Dies ist die einzig richtige Antwort. Regex ist nicht das richtige Werkzeug für den Job. Ich frage mich immer, wie standardkonform und sicher ein Uri mit Regex parsieren kann. Umgang mit internationalisierten (Unicode) Domains? Kodierungen, die den wahren Pfad verschleiern? Fehlertoleranz? Geprüft? Verwenden Sie einfach das .net-Framework! –

10

Die URI specification says:

Die folgende Zeile ist der reguläre Ausdruck für das Brechen-down eine gut gebildete URI-Referenz in ihre Komponenten.

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

(Ich denke, das ist die gleiche Regex wie im STD66 Link in einer anderen Antwort gegeben.)

Aber brechen-downnicht Validierung. Um einen URI korrekt zu validieren, müsste man den BNF for URIs in eine Regex übersetzen. Während einige BNFs nicht als reguläre Ausdrücke ausgedrückt werden können, denke ich mit diesem könnte getan werden. Aber es sollte nicht gemacht werden - es wäre eine riesige Sauerei. Es ist besser, eine Bibliotheksfunktion zu verwenden.

5

Die besten und definitive Leitfaden für diese ich gefunden habe, ist hier: http://jmrware.com/articles/2009/uri_regexp/URI_regex.html (In Antwort auf Ihre Frage, den URI Tabelleneintrag sehen)

Alle diese Regeln von RFC3986 in der Tabelle wiedergegeben werden 2 zusammen mit einer regulären Ausdrucksimplementierung für jede Regel.

Eine Javascript-Implementierung dieser ist hier verfügbar:

# RFC-3986 URI component: URI 
[A-Za-z][A-Za-z0-9+\-.]* :          # scheme ":" 
(?: //               # hier-part 
    (?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})* @)? 
    (?: 
    \[ 
    (?: 
     (?: 
     (?:             (?:[0-9A-Fa-f]{1,4}:) {6} 
     |             :: (?:[0-9A-Fa-f]{1,4}:) {5} 
     | (?:       [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {4} 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,1} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {3} 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,2} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {2} 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,3} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4}: 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,4} [0-9A-Fa-f]{1,4})? :: 
     ) (?: 
      [0-9A-Fa-f]{1,4} : [0-9A-Fa-f]{1,4} 
      | (?: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) \.){3} 
       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 
     ) 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,5} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4} 
     | (?: (?:[0-9A-Fa-f]{1,4}:){0,6} [0-9A-Fa-f]{1,4})? :: 
    ) 
    | [Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+ 
    ) 
    \] 
    | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} 
     (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 
    | (?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})* 
) 
    (?: : [0-9]*)? 
    (?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)* 
|/
    (?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+ 
    (?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)* 
)? 
|  (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+ 
    (?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)* 
| 
) 
(?:\? (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*)? # [ "?" query ] 
(?:\# (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*)? # [ "#" fragment ] 
+6

süße Mutter aller Regex, und meine Mitarbeiter denken, ich bin verrückt nach Regex zu verwenden und zu verstehen ... – Russ

1

Die beste Regex ich mit nach RFC 3986 kam (https://tools.ietf.org/html/rfc3986: https://github.com/jhermsmeier/uri.regex

Als Referenz wird die URI Regex unten wiederholt) war das folgende:

Flow diagram of regex using https://regexper.com

// named groups 
/^(?<scheme>[a-z][a-z0-9+.-]+):(?<authority>\/\/(?<user>[^@][email protected])?(?<host>[a-z0-9.\-_~]+)(?<port>:\d+)?)?(?<path>(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])*)*|(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+)*)?(?<query>\?(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?(?<fragment>\#(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?$/i 

// unnamed groups 
/^([a-z][a-z0-9+.-]+):(\/\/([^@][email protected])?([a-z0-9.\-_~]+)(:\d+)?)?((?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])*)*|(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+)*)?(\?(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?(\#(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?$/i 

Einfanggruppen

  1. Schema
  2. Autorität
  3. Userinfo
  4. Host
  5. Port
  6. Pfad
  7. query
  8. Fragment
  9. 0.123.