Queremos darte la mejor solución que hemos encontrado on line. Deseamos que te sea de mucha ayuda y si quieres aportar alguna mejora hazlo con total libertad.
Solución:
Bueno, si lo miras, la especificación se divide en “trozos”. Así es como sugeriría construir la expresión regular para que sea más fácil de leer, más fácil de mantener y comprensible. Entonces, las partes de la expresión regular son (opcional en cursiva):
- Esquema
- Usuario Contraseña
- Dominio o dirección IP
- Puerto
- Sendero
- Consulta
- Ancla
Entonces, necesitamos construir una subparte de expresiones regulares para cada uno.
-
Esquema:
$scheme = "[a-z][a-z0-9+.-]*";
-
Usuario Contraseña:
$username = "([^:@/](:[^:@/])[email protected])?";
-
Dominio o Dirección IP:
Ahora, necesitamos construir los 3 hosts posibles:
- Nombre de dominio
- IPv4
- IPv6
Nombre de dominio:
$segment = "([a-z][a-z0-9-]*?[a-z0-9])"; $domain = "($segment.)*$segment";
IPv4:
$segment = "([0|1][0-9]2|2([0-4][0-9]|5[0-5]))"; $ipv4 = "($segment.$segment.$segment.$segment)";
IPv6:
$block = "([a-f0-9]0,4)"; $rawIpv6 = "($block:)2,8"; $ipv4sub = "(::ffff:$ipv4)"; $ipv6 = "([($rawIpv6|$ipv4sub)])";
Finalmente:
$host = "($domain|$ipv4|$ipv6)";
-
Puerto:
$port = "(:[d]1,5)?";
-
Sendero:
$path = "([^?;#]*)?";
-
Consulta:
$query = "(?[^#;]*)?";
-
Ancla:
$anchor = "(#.*)?";
Y la expresión regular final:
$regex = "#^$scheme://$username$host$port(/$path$query$anchor|)$#i";
Tenga en cuenta que el /
está en la expresión regular, y no en la parte de la ruta, ya que la ruta puede estar vacía.
También tenga en cuenta que no he probado esto. Debería funcionar, pero definitivamente necesita confirmar que cada parte es correcta (en cuanto a qué esperar en la URL).
También tenga en cuenta que esta es solo una forma de hacerlo. Podría usar otras herramientas que no necesitan expresiones regulares o una biblioteca o marco que será más fácil de mantener a largo plazo.
La mejor de las suertes
Después de leer RFC 3986, debo decir que estaba equivocado. Esa expresión regular está funcionando completamente (que yo sepa). El primer error que tuve fue la sintaxis de las direcciones IPv6, se ponen alrededor [], y el segundo fue sobre example.org: (observe el doble punto final :). Pero como dice el RFC, el esquema puede tener puntos, por lo que también es válido.
Así que esa es una forma válida de RFC para hacerlo, pero las personas generalmente (como yo lo haré) necesitarán modificarlo para aceptar solo algunos esquemas.
Te mostramos las comentarios y valoraciones de los usuarios
Te invitamos a añadir valor a nuestro contenido informacional colaborando tu experiencia en las interpretaciones.