Posts Tagged ‘normalizar’

Normalizando paths

Friday, January 16th, 2009

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 :-)