我有一个包含图片网址列表的数组,我尝试使用正则表达式搜索/替换(通过gsub)。值的格式为//subdomain.website.com/folder/image.extension。我想添加' https'在每个数组条目的前面。
我试过使用gsub,但数组保持不变:
matches = source.scan(/(\/\/\w+\.\w+\.\w{2,4}\/\w+\/\w+\.\w{2,4})/).uniq
matches.each {|value| value.to_s.gsub!(/\/\//, 'https://')}
在Perl中,我可以做这样的事情来改变每个值:
for (@matches) {
s/\/\//https:\/\//g;
}
我是否以错误的方式调用gsub函数?
答案 0 :(得分:0)
首先,我发现你在to_s
上调用value
很奇怪,因为value
是一个数组,当转换为字符串时会包含数组符号,所以{{ 1}}可能看起来像value.to_s
。
您可以通过将正则表达式更改为不包含捕获组来避免这种情况:
["//subdomain.website.com/folder/image.exte"]
现在问题的主要部分,您应该在/\/\/\w+\.\w+\.\w{2,4}\/\w+\/\w+\.\w{2,4}/
上调用map
,而不是matches
。 each
方法将数组中的每个元素更改为使用给定元素调用提供的块的结果。
放在一起可能看起来像这样:
map
答案 1 :(得分:0)
如果您知道数组的每个元素都已正确格式化并准备好"https:"
前置,那么连接似乎比gsub更简单。例如,
matches.map! { |value| "https:" << value }
如果有@August所描述的字符串数组,应该可以工作。
答案 2 :(得分:0)
你可以尝试这样的事情。
matches.map{|m| "https#{m}"}
这应该将https添加到每个元素的前面。
答案 3 :(得分:0)
Ruby为此提供了一个很好的类URI,所以请利用它:
require 'uri'
uri = URI.parse('//www.example.com') # => #<URI::Generic:0x007ff0098581e8 URL://www.example.com>
uri.scheme = 'https' # => "https"
uri.to_s # => "https://www.example.com"
如果您要处理网址列表:
%w[
//www.example.com
].map{ |url| # => ["//www.example.com"]
uri = URI.parse(url) # => #<URI::Generic:0x007ff009853350 URL://www.example.com>
uri.scheme = 'https' # => "https"
uri.to_s # => "https://www.example.com"
} # => ["https://www.example.com"]
URI的优势在于,如果URL已经有一个方案或者完全没有它,那么它可以做正确的事情:
require 'uri'
%w[
http://foo.com
https://foo.com
//foo.com
].map { |url|
uri = URI.parse(url)
uri.scheme = 'https'
uri.to_s
} # => ["https://foo.com", "https://foo.com", "https://foo.com"]
如果你坚持使用正则表达式,那么简化它:
url = '//www.example.com'
url[/^/] = 'https:'
url # => "https://www.example.com"
和
%w[
//www.example.com
].map{ |url| # => ["//www.example.com"]
url[/^/] = 'https:' # => "https:"
url # => "https://www.example.com"
} # => ["https://www.example.com"]
使用正则表达式并不足以判断方案是否已存在,因此必须编写更多代码来处理这种情况。