2009-07-17 12 views
23

estoy usando la siguiente expresión regular para que coincida con una dirección URL:expresión regular para que coincida con el URL

$search = "/([\S]+\.(MUSEUM|TRAVEL|AERO|ARPA|ASIA|COOP|INFO|NAME|BIZ|CAT|COM|INT|JOBS|NET|ORG|PRO|TEL|AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|au|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|R|H|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|YU|ZA|ZM|ZW)([\S]*))/i"; 

pero es un poco jodido, ya que también coincide con "abc.php", que no quiero. y algo así como abc ... prueba. Sin embargo, quiero que coincida con abc.com. y www.abc.com así como http://abc.com.

Simplemente necesita un ligero ajuste al final, pero no estoy seguro de qué. (Debería haber una barra después del nombre de dominio que no está buscando en este momento y solo está marcando \ S)

gracias por su tiempo.

Respuesta

19
$search = "#^((?# 
    the scheme: 
)(?:https?://)(?# 
    second level domains and beyond: 
)(?:[\S]+\.)+((?# 
    top level domains: 
)MUSEUM|TRAVEL|AERO|ARPA|ASIA|EDU|GOV|MIL|MOBI|(?# 
)COOP|INFO|NAME|BIZ|CAT|COM|INT|JOBS|NET|ORG|PRO|TEL|(?# 
)A[CDEFGILMNOQRSTUWXZ]|B[ABDEFGHIJLMNORSTVWYZ]|(?# 
)C[ACDFGHIKLMNORUVXYZ]|D[EJKMOZ]|(?# 
)E[CEGHRSTU]|F[IJKMOR]|G[ABDEFGHILMNPQRSTUWY]|(?# 
)H[KMNRTU]|I[DELMNOQRST]|J[EMOP]|(?# 
)K[EGHIMNPRWYZ]|L[ABCIKRSTUVY]|M[ACDEFGHKLMNOPQRSTUVWXYZ]|(?# 
)N[ACEFGILOPRUZ]|OM|P[AEFGHKLMNRSTWY]|QA|R[EOSUW]|(?# 
)S[ABCDEGHIJKLMNORTUVYZ]|T[CDFGHJKLMNOPRTVWZ]|(?# 
)U[AGKMSYZ]|V[ACEGINU]|W[FS]|Y[ETU]|Z[AMW])(?# 
    the path, can be there or not: 
)(/[a-z0-9\._/~%\-\+&\#\?!=\(\)@]*)?)$#i"; 

Acabo de limpiar un poco. Esto coincidirá (s) direcciones única HTTP, y, siempre que haya copiado todos los dominios de nivel superior correctamente desde IANA, sólo aquellos estandarizado (que se no partido http://localhost) y con el http:// declarado.

Finalmente, debe terminar con la parte de ruta, que siempre comenzará con un /, si está allí.

Sin embargo, le sugiero que siga Cerebrus: Si no está seguro de esto, aprenda a usar expresiones regulares de una manera más suave y use patrones comprobados para tareas complicadas.

Saludos,

Por cierto: Su expresión regular también una perfecta something.r y something.h (entre | A | y | TR | en su ejemplo). Los dejé en mi versión, ya que supongo que fue un error tipográfico.

Al volver a leer la pregunta: Cambio

)(?:https?://)(?# 

a

)(?:https?://)?(?# 

(hay un ? adicional) para que coincida con las URL '' sin el esquema.

+1

pero no quiero el http: // al principio obligatorio. como yo quiero que coincida con "abc.com" también. –

+0

parece que hemos comentado/editado de forma sincrónica. Fijo. – Boldewyn

+0

¿puede por favor mejorar [\ S] * probablemente no tenga espacios + solo palabras + solo números o lo que esté permitido en una URL? –

1

Usar una sola expresión regular para que coincida con una cadena de URL hace que el código sea increíblemente ilegible. Sugiero usar parse_url para dividir la URL en sus componentes (lo cual no es una tarea trivial) y verificar cada parte con una expresión regular.

1

Cambiar el final de la expresión regular a (/\S*)?)$ debería resolver su problema.

Para explicar lo que está haciendo -

  • que está buscando / seguido de algunos caracteres (sin espacios en blanco)
  • este partido es opcional, ? indicados 0 o 1 veces
  • y finalmente debe ir seguido de un final de cadena (o cámbielo a \b para que coincida con un límite de palabras).
0

$: El dólar significa el final de la cadena.
Por ejemplo, \ d * $ coincidirá con cadenas que finalizan con un dígito. ¡Entonces necesita agregar $!

12

No es exactamente lo que solicitó el OP, pero esta es una expresión regular mucho más simple que no necesita actualizarse cada vez que IANA presenta un nuevo TLD. Creo que esto es más adecuado para las necesidades más simples:

^(?:https?://)?(?:[\w]+\.)(?:\.?[\w]{2,})+$ 

ninguna lista de TLD, localhost no se corresponde, el número de subpartes debe ser> = 2 y la longitud de cada subparte debe ser> = 2 (fx : "aa" no coincidirá pero "a.ab" coincidirá).

+0

¿Entonces esto no coincide con la parte path & query param de url? – lulalala

+0

También no coincide con los guiones en la URL. – Styphon

+1

Necesita escabullirse en 'https?: //' pero aún así es demasiado amplio. Puede probarlo aquí: http://www.regexr.com/ – ahmd0

-2

(http|www)\S+

Sólo usa esta expresión regular para coincidir con todos de

+1

¿Qué pasa con ftp? – Flexo

+9

Esta es una expresión regular muy mala. No puedo creer que la gente realmente votó por eso. Es malo porque también coincidirá con el 'httpcheese' completamente inválido como una URL válida. –

-2

url Sólo para añadir a las cosas. Sé que esto no responde completamente y directamente a esta pregunta específica, pero es el mejor lugar que puedo encontrar para agregar esta información. Escribí un jQuery plug hace un tiempo para hacer coincidir las URL con un propósito similar, sin embargo, en el estado actual (se actualizará a medida que pasa el tiempo) aún considerará direcciones como 'http: //abc.php' como válidas. Sin embargo, si no hay http, https o ftp en el inicio de url, no devolverá 'válido'. Aunque debo aclarar, este método jQuery devuelve un objeto y no solo una cadena o booleano. El objeto descompone las cosas y entre el desglose hay un booleano .valid. Ver el violín completo y probar en el enlace en la parte inferior. Si simplemente quiere agarrar el plugin e ir, ver más abajo:

jQuery Plugin

(function($){$.matchUrl||$.extend({matchUrl:function(c){var b=void 0,d="url,,scheme,,authority,path,,query,,fragment".split(","),e=/^(([^\:\/\?\#]+)\:)?(\/\/([^\/\?\#]*))?([^\?\#]*)(\?([^\#]*))?(\#(.*))?/,a={url:void 0,scheme:void 0,authority:void 0,path:void 0,query:void 0,fragment:void 0,valid:!1};"string"===typeof c&&""!=c&&(b=c.match(e));if("object"===typeof b)for(x in b)d[x]&&""!=d[x]&&(a[d[x]]=b[x]);a.scheme&&a.authority&&(a.valid=!0);return a}});})(jQuery); 

jsFiddle con el ejemplo:

http://jsfiddle.net/SpYk3/e4Ank/

0

expresión regular para que coincida todas las URL (con www, sin www, con http o https) , sin http o https, incluye todos los nombres de dominio de nivel superior de 2-6 letras [para países, ex 'ly', 'nos'], puertos, cadenas de consulta y anclajes ['#']). No es 100% pero es mejor que cualquier cosa que haya visto publicado en la web.

Utiliza los dominios de nivel superior de la primera respuesta, combinados con otras técnicas que se encuentran en mis búsquedas. Devolverá cualquier URL válida que tenga límites, es decir, donde \ b entra en juego. Como el \ "final" también se desencadena por \ b, el último, es una coincidencia para uno o más '?'.

/\b((http(s?):\/\/)?([a-z0-9\-]+\.)+(MUSEUM|TRAVEL|AERO|ARPA|ASIA|EDU|GOV|MIL|MOBI|COOP|INFO|NAME|BIZ|CAT|COM|INT|JOBS|NET|ORG|PRO|TEL|A[CDEFGILMNOQRSTUWXZ]|B[ABDEFGHIJLMNORSTVWYZ]|C[ACDFGHIKLMNORUVXYZ]|D[EJKMOZ]|E[CEGHRSTU]|F[IJKMOR]|G[ABDEFGHILMNPQRSTUWY]|H[KMNRTU]|I[DELMNOQRST]|J[EMOP]|K[EGHIMNPRWYZ]|L[ABCIKRSTUVY]|M[ACDEFGHKLMNOPQRSTUVWXYZ]|N[ACEFGILOPRUZ]|OM|P[AEFGHKLMNRSTWY]|QA|R[EOSUW]|S[ABCDEGHIJKLMNORTUVYZ]|T[CDFGHJKLMNOPRTVWZ]|U[AGKMSYZ]|V[ACEGINU]|W[FS]|Y[ETU]|Z[AMW])(:[0-9]{1,5})?((\/([a-z0-9_\-\.~]*)*)?((\/)?\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)/gi 
+0

¿Qué significa "/?" significa cerca del final de la expresión regular? Querías decir "\/?" – barrycarter

+0

Parece que no funciona para cosas como "http://s3.amazonaws.com/plivocloud/4c743546-7e1b-11e2-9060-002590662312.mp3" – barrycarter

0

este es el que:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS 
6

Esta pregunta fue sorprendentemente difícil encontrar una respuesta para. Las expresiones regulares que encontré eran demasiado complicadas de comprender, y algo más que una expresión regular es excesiva y demasiado difícil de implementar.

Finalmente se le ocurrió:

/(\S+\.(com|net|org|edu|gov)(\/\S+)?)/ 

Obras con http://example.com, https://example.com, example.com, http://example.com/foo.

Explicación:

  • busca .com, etc.
  • Partidos todo antes de que hasta el espacio
  • Partidos todo después de que hasta el espacio
0

creo que este es simple y eficiente /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

0

Probar Regexy::Web::Url

r = Regexy::Web::Url.new # matches 'http://foo.com', 'www.foo.com' and 'foo.com'

3

Esto hará que cualquier URL en su totalidad, incluyendo = y #/si existen:?

/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g 
-1
[ftp:\/\/www\/.-https:\/\/-http:\/\/][a-zA-Z0-9u00a1-uffff0]{1,3}[^ ]{1,1000} 

Esto funciona muy bien para mí en js

var regex = new RegExp('[ftp:\/\/www\/.-https:\/\/-http:\/\/][a-zA-Z0-9u00a1-uffff0]{1,3}[^ ]{1,1000}'); 
regex.exec('https://www.youtube.com/watch?v=FM7MFYoylVs&feature=youtu.be&t=20s'); 
+1

¿Puedes formatear mejor tu respuesta? Es muy difícil de entender – Felix

Cuestiones relacionadas