2008-08-27 26 views
14

¿Cómo se produce una expresión regular que solo coincide con el URI válido? La descripción de los URI se puede encontrar aquí: http://en.wikipedia.org/wiki/URI_scheme. No es necesario extraer ninguna parte, solo prueba si un URI es válido.Regex para validar URI

(formato preferido es .Net RegularExpression) (.Net Version 1,1)

  • ¿No Neet para comprobar si hay un protocolo conocido, sólo un uno válido.

Solución actual:

^([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]]+)?$ 

Respuesta

9

Este sitio parece prometedor: http://snipplr.com/view/6889/regular-expressions-for-uri-validationparsing/

Proponen siguiente expresión regular:

/^([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

Usé este truco en PHP. Para los programadores de PHP, consulte aquí: https://stackoverflow.com/questions/206059/php-validation-regex-for-url –

1

¿Hay algunos URIs específicas que le interesan o está tratando de encontrar una sola expresión regular que valida STD66?

Iba a señalarte this regex para analizar un URI. En teoría, podría verificar si todos los elementos que le interesan están ahí.

Pero creo que bdukes respuesta es mejor.

23

¿Funciona el Uri.IsWellFormedUriString?

+0

+1 Esta es la única respuesta correcta. Regex no es la herramienta correcta para el trabajo. Siempre me pregunto cómo puede ser compatible con los estándares y el análisis seguro de URI con expresiones regulares. ¿Tratar con dominios internacionalizados (unicode)? Codificaciones que ofuscan el verdadero camino? ¿Tolerante a fallos? Probado? Solo usa el framework .net! –

10

El URI specification says:

La siguiente línea es la expresión regular para romper hacia abajo un bien formó la referencia de URI en sus componentes.

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

(supongo que por la misma expresión regular como en el enlace STD66 dada en otra respuesta.)

Pero romper hacia abajo no está validando . Para validar correctamente un URI, uno debería traducir el BNF for URIs a una expresión regular. Mientras que algunos BNFs no pueden expresarse como expresiones regulares, creo que con este podría hacerse. Pero no debería hacerse, sería un gran desastre. Es mejor usar una función de biblioteca.

5

La guía mejor y más definitiva a este que he encontrado es aquí: http://jmrware.com/articles/2009/uri_regexp/URI_regex.html (En respuesta a su pregunta, vea la entrada del mesa URI)

Todas estas reglas de RFC3986 se reproducen en la tabla 2 junto con una implementación de expresión regular para cada regla.

Una aplicación Javascript esto está disponible aquí: https://github.com/jhermsmeier/uri.regex

Como referencia, la expresión regular URI se repite a continuación:

# 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

dulce madre de todos los regex, y mis compañeros de trabajo creen que estoy loco por usar y comprender la expresión regular ... – Russ

1

La mejor expresión regular que se me ocurrió de acuerdo con RFC 3986 (https://tools.ietf.org/html/rfc3986) fue el siguiente:

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 

grupos de captura

  1. esquema
  2. autoridad
  3. userinfo
  4. anfitrión
  5. puerto
  6. camino
  7. consulta
  8. fragmento
Cuestiones relacionadas