Regex para coincidir con la URL donde el esquema es opcional (sin "http")
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.
$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://localhost
con 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.r
con 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.
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í).
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.
Esto obtendrá cualquier URL en su totalidad, incluyendo ?= y #/ si existen:
/[A-Za-z]+:\/\/[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_:%&;\?\#\/.=]+/g