Ruby:搜索模式的文件文本,并用给定值替换它的“部分”?

时间:2015-06-04 23:18:20

标签: ruby regex file-io

这是this post的后续问题。

我是Ruby新手,想要创建一个脚本来搜索文件中的模式。但是,我只想替换它的一部分,即删除所有http://模式匹配,但只有 后跟一个有效的网址。

1 个答案:

答案 0 :(得分:1)

如果“有效网址”表示该字符串可以作为网址解析,那么您可以尝试使用URI.parse。例如:

require 'uri'
IO.readlines(input_file).each do |line|
  line.gsub(%r;(https?://\S+);) do |url|
    URI.parse(url) && '' rescue url
  end
end

但是,URI模块非常宽松。您会发现not-an-uri之类的字符串被视为有效的“通用”URI。

您可能想要检查是否可以获取捕获的URL并返回成功的HTTP状态。这显然更加耗费资源,因此在大型输入文件上操作会非常慢。它也可能被视为安全风险。

require 'uri'
require 'net/http'

def valid_url?(url)
  uri = URI.parse(url)
  Net::HTTP.get_response(uri).is_a? Net::HTTPSuccess
rescue
 return false
end

IO.readlines(input_file).each do |line|
  line.gsub(%r;(https?://\S+);) do |url|
    valid_url?(url) ? '' : url
  end
end