2011-04-19 30 views
14

He escrito expresiones regulares para validar URL que podría ser tanto comoExpresión regular para la URL

los 4 están trabajando

Ahora, si yo estoy entrando en un texto como (www.google.com - thisisincorrect), que me permite introducir y guardar en db

La expresión regular que he utilizado es:

http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 

y

([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 

Por favor, ayuda!

+0

es que "^ http (s): // (. [\ W] +) + [\ W] + (/ [\ W- ./?%&=])?$ "trabajo para usted? – PrateekSaluja

Respuesta

16

Añadir ^ y $

^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$ 

Estas estadísticas se corresponden principio de la cadena (^) y al final ($)

+1

Gracias Funciona, pero se puede comprobar "([\ w -] + \.) + [\ W -] + (/ [\ w- ./?%&=]*)? " este reg ex no está funcionando para a) google.com b) www.google.com – PrateekSaluja

+0

Esto no funciona con trailing /. agregue '/' al final de la url. –

56

No se necesita una expresión regular para las direcciones URL, utilice System.Uri clase para esto. P.ej. mediante el uso de Uri.IsWellFormedUriString método para esto:

bool isUri = Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute); 
+1

¿Estás seguro de que esto funciona? Comprueba esto, bool isValid = Uri.IsWellFormedUriString ("ktp: //yahoo.co.in/index.ez", UriKind.RelativeOrAbsolute); y vuelve verdadero. ¿Existe un esquema llamado ktp: //? – Chaitanya

+6

@Chaitanya: según RFC 2396, sección 3.1, 'ktp' es un nombre de esquema perfectamente ** válido **. P.ej. un protocolo personalizado podría definir este esquema. – Alex

+1

En muchos casos, SÍ necesita una expresión regular para la validación de cadenas. Por ejemplo, no puede pasar una función a una regla de FluentValidation. –

1

al crear una expresión regular para la estricta coincidencia, se debe hacer es asegurarse de que comienza con '^' y termina con '$'. De lo contrario, la expresión regular verá si encuentra una subcadena que coincida.

  • '^' significa partido comience la línea
  • '$' significa extremo de la línea de partido.

Sin embargo, utilizando una expresión regular para que coincida con una dirección URL es propenso a errores: mejor confiar en los marcos existentes hacerlo mejor (hay un montón de trampas potenciales en URL, como parámetros, dominios unkown, url que contiene IP en lugar de dominio ....)

10

mejor expresión regular:

private bool IsUrlValid(string url) 
{ 

    string pattern = @"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$"; 
    Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    return reg.IsMatch(url); 
} 
+0

este formato 'hack: // blah.blah.com' devuelve verdadero ... – Choletski

-2
@"^(((ht|f)tp(s?)\://)|(www))?[^.](.)[^.](([-.\w]*[0-9a-zA-Z])+(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*))[^.](.)[^.]([a-zA-Z0-9]+)$"; 
+0

En el futuro intenta ofrecer un poco de explicación junto con tu respuesta para ayudarnos a todos a entender qué puede ofrecer tu respuesta que otros no lo están :) – bwegs

+1

No. No * "en el futuro" *. Puede * y debe *, simplemente * edite su respuesta *. Mientras que las respuestas de solo código que abordan el problema de la pregunta son * válidas * (si * "resuelven el problema de la pregunta" *), no se comunican y, en algunos casos, son inapropiadas, ya que * no abordan ** por qué ** son correctos *, que es la parte más importante de * buena respuesta *. – XenoRo

0

que busca este

Sin Http:

@"^(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$" 

por http (s):

@"^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$" 

o

@"^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$"; 
Cuestiones relacionadas