Normalizando paths
regexp, normalizar, path, file
Básicamente normalizar un path consiste en remover todas las ocurrencias ‘..’ y ‘.’ para obtener un path absoluto. Por ejemplo, si tenemos: /foo/bar/../baz, normalizado quedarÃa /foo/baz.
Podemos hacer una sencilla función de normalización en Ruby con la ayuda de expresiones regulares. Por ejemplo:
def normalizar path
ret = path.split(%r{/\.(/|\Z)}).join
ret = ret.split(%r{/[^/]+/\.\.}).join
raise "path incorrecto" if %r{/\.\.(/|\Z)} =~ ret ||
ret[0] != ?/
ret
end
Expliquemos que hace cada lÃnea:
- path.split(%r{/.(/|\Z)}).join; remueve todas las ocurrencias ‘.’ del path.
- ret.split(%r{/[^/]+/..}).join; remueve todas las ocurrencias ‘..’ del path.
- %r{/..(/|\Z)} =~ ret || ret[0] != ?/; larga una excepción en caso de que se ingrese un path que no pueda ser normalizado. Verifica que el primer caracter del path sea ’/’ y que no se tengan situaciones como ’/../foo’.
Dejo un par de ejemplo de prueba:
irb(main):002:0> normalizar "/foo/../bar/."
=> "/bar"
irb(main):003:0> normalizar "/foo/./bar/../baz"
=> "/foo/baz"
irb(main):004:0> normalizar "./foo/./bar/../baz"
RuntimeError: path anormal `./foo/./bar/../baz'
from (irb):4
irb(main):005:0> normalizar "../foo/"
RuntimeError: path anormal `../foo/'
from (irb):5
irb(main):006:0> normalizar "/../foo/"
RuntimeError: path anormal `/../foo/'
from (irb):6
Pueden probar los ejemplos online desde aquÃ: http://www.rubular.com/
Son bienvenidos aportes y comentarios :-)