2015-09-25 89 views
-2
/events/3122671255551936/?ref=br_rs&action_history=null 

我只是想后 '/事件/' 之前“/ REF = br_rs提取数... \你如何解析这个字符串?

+3

书写代码将是一个很好的开始... –

+1

你能告诉我们你已经尝试过了吗?这个问题有几种可能的解决方案,具有不同程度的稳定性和难度,我们需要知道你处于什么样的状况以及你能够处理什么。 –

+0

谢谢,你是对的。我曾尝试将字符串分成3部分,只使用第二部分,但提供的答案更好。谢谢你的帮助! – user1683056

回答

1

你可以通过/字拆呢?

irb(main):003:0> "/events/3122671255551936/?ref=br_rs&action_history=null".split("/")[2] 
=> "3122671255551936" 
0

您还可以使用String#scan方法来获取数字:

"/events/3122671255551936/?ref=br_rs&action_history=null".scan(/\d+/).join 
# => "3122671255551936" 
+0

这是很好的,直到查询部分中包含一个数字的参数。查询很容易从服务器端改变,通常没有任何通知。 –

0

如果字符串是str

x = str["/events/".size..-1].to_i 
    #=> 3122671255551936 

如果你希望字符串:

x.to_s 
    #=> "3122671255551936" 
0

你正在寻找从一个URL路径。基本split最初将工作:

str = '/events/3122671255551936/?ref=br_rs&action_history=null' 
str.split('/')[2] # => "3122671255551936" 

现存有工具,使这个容易,这将URL的处理过程中处理编码和特殊字符解码:

require 'uri' 

str = '/events/3122671255551936/?ref=br_rs&action_history=null' 
scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI.split(str) 
scheme # => nil 
userinfo # => nil 
host  # => nil 
port  # => nil 
registry # => nil 
path  # => "/events/3122671255551936/" 
opaque # => nil 
query # => "ref=br_rs&action_history=null" 
fragment # => nil 

uri = URI.parse(str) 

path访问路径组件

uri.path # => "/events/3122671255551936/" 

因此很容易抢值:

的URL
uri.path.split('/')[2] # => "3122671255551936" 

现在,想象一下,如果该URL具有像“http://www.example.com/”这样的主机,就像大多数URL一样。 (写好几百个蜘蛛和铲运机的,我知道它是多么容易遇到这样的变化。)使用一个天真split('/')会立即打破:

str = 'http://www.example.com/events/3122671255551936/?ref=br_rs&action_history=null' 
str.split('/')[2] # => "www.example.com" 

这意味着任何解决方案依靠split单独将打破,随着任何其他尝试根据整个字符串来定位值的位置的人。

但是,使用专为工作的代码会继续工作的工具:

uri = URI.parse(str) 
uri.path.split('/')[2] # => "3122671255551936" 

注意多么简单和易于阅读它,这将转移到更易于维护。它甚至可以简化为:

URI.parse(str).path.split('/')[2] # => "3122671255551936" 

并继续工作。

这是因为URL/URI是一个商定的标准,可以编写一个解析器来分解并生成一个符合标准的字符串。

有关更多信息,请参阅URI文档。