2011-02-11 14 views
5

Quiero reemplazar todas las barras múltiples en la URL, además de las de definición de protocolo ('http [s]: //', 'ftp: //' y etc.). ¿Cómo hago esto?Ruby regex: reemplazar barras dobles en URL

Este código reemplaza sin ningún tipo de excepciones:

url.gsub(/\/\/+/, '/') 

Respuesta

9

sólo tiene que excluir cualquier partido que está precedida por :

url.gsub(/([^:])\/\//, '\1/') 
+1

Gracias, pero ¿cómo podría evitar que seleccione el personaje más cercano desde la izquierda? http://rubular.com/r/PhVk4JSxcx – krn

+1

Utilice un aspecto negativo detrás: '% r {(? Phrogz

+1

Si no tiene un aspecto negativo detrás, puede usar una captura 'url.gsub (/ ([^:]) \/\ //, '\ 1 /')' – Stuart

0

gsub puede tomar un bloque:

url = 'http://host.com//foo/bar' 
puts url.gsub(%r{.//}) { |s| (s == '://') ? s : s[0] + '/' } 
>> http://host.com/foo/bar 

O, como @Phrogz tan amablemente nos recordó:

puts url.gsub(%r{(?<!:)//}, '/') 
>> http://host.com/foo/bar 
2

He intentado utilizar URI:

require "uri" 
url = "http://host.com//foo//bar" 
components = URI.split(url) 
components[-4].gsub!(/\/+/, "/") 
fixed_url = [components[0], "://", components[2], components[-4]].join 

pero que parecía casi mejor que usar una expresión regular.