Regex para coincidir con la URL donde el esquema es opcional (sin "http")

Resuelto Alec Smart asked hace 15 años • 14 respuestas

Estoy usando la siguiente expresión regular para hacer coincidir una 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 está un poco jodido porque también coincide con "example.php", que no quiero. y algo así como abc...prueba. Sin embargo, quiero que coincida con example.com. y www.example.com así como http://example.com .

Sólo necesita un pequeño ajuste al final, pero no estoy seguro de qué. (debe haber una barra diagonal después de cualquier nombre de dominio que no esté verificando en este momento y solo esté verificando \S)

Gracias por tu tiempo.

Alec Smart avatar Jul 17 '09 14:07 Alec Smart
Aceptado
$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á solo con direcciones HTTP y, siempre que haya copiado correctamente todos los dominios de nivel superior de IANA, solo aquellos estandarizados (no coincidirá ) y http://localhostcon lo declarado http://.

Finalmente debes terminar con la parte de la ruta, que siempre comenzará con /, si está ahí.

Sin embargo, sugeriría seguir a Cerebrus: si no está seguro de esto, aprenda las expresiones regulares de una manera más suave y use patrones probados para tareas complicadas.

Salud,

Por cierto: su expresión regular también coincidirá something.rcon y something.h(entre |TO| y |TR| en su ejemplo). Los omití en mi versión, porque supongo que fue un error tipográfico.

Al releer la pregunta: Cambiar

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

a

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

(hay un ?extra) para hacer coincidir 'URL' sin el esquema.

Boldewyn avatar Jul 17 '2009 08:07 Boldewyn

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

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

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

Diego Perini avatar Aug 18 '2010 02:08 Diego Perini

Fue sorprendentemente difícil encontrar una respuesta a esta pregunta. Las expresiones regulares que encontré eran demasiado complicadas de entender, y cualquier cosa 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+)?)/

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

Explicación:

  • Busca .com, etc.
  • Combina todo lo anterior hasta el espacio.
  • Combina todo lo que sigue hasta el espacio.
B Seven avatar Jul 18 '2013 22:07 B Seven

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

/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g
Miko Trueman avatar Jul 29 '2015 15:07 Miko Trueman