2016-10-04 162 views
-1

我想檢查我的URL格式是正確的,它有一些AWS ACCES鍵等:正則表達式來檢查URL格式

/https://bucket.s3.amazonaws.com/path/file.txt?AWSAccessKeyId=[.+]&Expires=[.+]&Signature=[.+]/.match(url) 

^這樣的事情。能否請你幫忙?

+0

搜索:[url正則表達式](http://stackoverflow.com/search?q=url+regex) – Tushar

回答

0

我們需要一個URL一起工作:

url = "/https://bucket.s3.amazonaws.com/path/file.txt?AWSAccessKeyId=somestuff&Expires=somemorestuff&Signature=evenmorestuff" 

我們還需要逃脫了一堆東西,做一些非貪婪匹配(+?):

/https:\/\/bucket.s3.amazonaws.com\/path\/file\.txt\?AWSAccessKeyId=.+?&Expires=.+?&Signature=.+/.match(url) 

=> #<MatchData "https://bucket.s3.amazonaws.com/path/file.txt?AWSAccessKeyId=somestuff&Expires=somemorestuff&Signature=evenmorestuff"> 
1

URI RFC指定此正則表達式解析URL和URI:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 

您也可以使用URI module在Ruby標準庫:

require 'uri' 
if url =~ /^#{URI::regexp(%w(http https))}$/ 
    puts "it's an url alright" 
else 
    puts "that's no url, that's a spaceship" 
end 

要檢查的「一些AWS訪問鍵等」的存在,你可以這樣做:

require 'uri' 
uri = URI.parse(url) 
params = URI.decode_www_form(uri.query).to_h 
if params.has_key?('AWSAccessKeyId') 
    unless params['AWSAccessKeyId'] =~ /\A[a-f0-9]{32}\z/ 
    abort 'AWSAccessKeyId not valid' 
    end 
else 
    abort 'AWSAccessKeyId required' 
end 

當然你可以用正則表達式來直接解析它們,但它變得醜陋,因爲參數的順序可能會有所不同:

>> url = "https://bucket.s3.amazonaws.com/path/file.txt?AWSAccessKeyId=abcd12345&Expires=12345678&Signature=abcd" 
>> matchdata = url.match(
/
    \A 
     (?<scheme>http(?:s)?):\/\/ 
     (?<host>[^\/]+) 
     (?<path>\/.+)\? 
     (?=.*(?:[\?\&]|\b)AWSAccessKeyId\=(?<aws_access_key_id>[a-f0-9]{1,32})) 
     (?=.*(?:[\?\&]|\b)Expires=(?<expires>[0-9]+)) 
    /x 
) 
=> #<MatchData "https://bucket.s3.amazonaws.com/path/file.txt?" 
    scheme:"https" 
    host:"bucket.s3.amazonaws.com" 
    path:"/path/file.txt" 
    aws_access_key_id:"abcd12345" 
    expires:"12345678"> 

>> matchdata[:aws_access_key_id] 
# => "abcd12345" 

它使用

  1. 正則表達式的積極前瞻:(?=..)忽略參數 爲了
  2. Ruby的正則表達式命名捕獲(?<param_name>.*)識別 的PARAMS從比賽數據
  3. 非捕獲分組(?abcd|efgh)
  4. 的匹配(?[\&\?]|\b)處理Expires=...?Expires=...&Expires=...
  5. 最後,/x自由間距修改器改爲 允許更好的格式
+0

在地球上如何檢查「它有一些AWS acces鍵等」? – mudasobwa

+0

@mudasobwa現在它。 –