这个正则表达式验证Ruby中的URL有什么问题?

时间:2009-05-18 17:33:54

标签: ruby regex

我正在传递一系列URL进行验证。功能如下。 当我只传递一个URL但不超过一个URL时,它可以工作。正则表达似乎是正确的。我哪里错了?

  def check_urls (list) 
    regexp =/(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix    
    list.each do |url| 
        if not regexp.match(url) 
            return false 
        end 
    end 
    return true 
  end

修正了错误。正则表达式函数没有错,只是拆分错了。

感谢所有抽出时间帮助的人。

5 个答案:

答案 0 :(得分:2)

尝试检查每个网址,然后将其与正则表达式进行匹配:

def check_urls (list) 
  regexp =/(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix        
  list.all? do |url|
    p url # see what URL is getting inspected
    regexp =~ url  # make sure it matches the regexp
  end
end

这可以帮助您找到与其不匹配的网址,您可以在那里工作。

答案 1 :(得分:1)

也许你可以尝试解析uris并在出错时中止。

def check_urls(list = [])
  list.to_a.all? do |uri_string|
    uri = URI.parse(uri_string) rescue nil
    uri && uri.scheme == "http"
  end
end

另请参阅Enumerable#allURI.parse

的文档

答案 2 :(得分:0)

结帐Rubular。这是一个很好的小工具,在很多情况下帮助了我。

答案 3 :(得分:0)

好的,找到了概率。 我试图像这样分割字符串

user_input.split( “\ r \ n” 个)

看起来这是错误的,这就是为什么函数对一个值而不是一个值正常工作的原因,因为数组总是包含一个字符串,即输入字符串: - (

答案 4 :(得分:0)

此方法可以满足您的要求。 它也可以在String类中:

def linkify text
  text.gsub!(/\b((https?:\/\/|ftps?:\/\/|mailto:|www\.)([A-Za-z0-9\-_=%&@\?\.\/]+))\b/) {
    match = $1
    tail  = $3
    case match
    when /^www/     then  "<a href=\"http://#{match}\">Link</a>"
    when /^mailto/  then  "<a href=\"#{match}\">Link</a>"
    else                  "<a href=\"#{match}\">Link</a>"
    end
  }
  text
end