¿Cómo pueden los múltiples barras al final se pueden eliminar de una URL en Rubí
-
03-10-2019 - |
Pregunta
Lo que estoy tratando de lograr aquí es digamos que tenemos dos URL de ejemplo:
url1 = "http://emy.dod.com/kaskaa/dkaiad/amaa//////////"
url2 = "http://www.example.com/"
¿Cómo puedo extraer las direcciones URL de rayas abajo?
url1 = "http://emy.dod.com/kaskaa/dkaiad/amaa"
url2 = "http://http://www.example.com"
URI.parse
en Ruby desinfecta cierto tipo de dirección URL incorrecta, pero es ineficaz en este caso.
Si usamos /^(.*)\/$/
entonces la expresión regular elimina una sola barra de /
url1
y es ineficaz para url2
.
Hay alguien consciente de cómo manejar este tipo de análisis de URL?
El punto aquí es que no quiero que mi sistema tenga http://www.example.com/
y http://www.example.com
siendo tratados como dos URLs diferentes. Y mismo ocurre con http://emy.dod.com/kaskaa/dkaiad/amaa////
y http://emy.dod.com/kaskaa/dkaiad/amaa/
.
Solución
Si sólo tiene que quitar todas las barras desde el final de la cadena de URL a continuación, puede probar la siguiente expresión regular:
"http://emy.dod.com/kaskaa/dkaiad/amaa//////////".sub(/(\/)+$/,'')
"http://www.example.com/".sub(/(\/)+$/,'')
/(\/)+$/
- esta expresión regular encuentra una o más barras al final de la cadena. Entonces sustituimos este partido con la cadena vacía.
Espero que esto ayude.
Otros consejos
A pesar de que este hilo es un poco viejo y la respuesta de arriba es bastante bueno, pero sugiere otra manera de hacer esto:
/^(.*?)\/$/
Se podía ver en acción aquí: https://regex101.com/r/vC6yX1/2
La magia aquí es *?
, lo que hace un partido flojo. Así que toda la expresión podría traducirse como:
Partido el menor número de caracteres como se puede y capturarlo, mientras que partido tantas barras como pueda al final.
Lo que significa que, en un Inglés más claro, elimina todas las barras al final.
def without_trailing_slash path
path[ %r(.*[^/]) ]
end
path = "http://emy.dod.com/kaskaa/dkaiad/amaa//////////"
puts without_trailing_slash path # "http://emy.dod.com/kaskaa/dkaiad/amaa"