/events/3122671255551936/?ref=br_rs&action_history=null
我只是想后 '/事件/' 之前“/ REF = br_rs提取数... \你如何解析这个字符串?
/events/3122671255551936/?ref=br_rs&action_history=null
我只是想后 '/事件/' 之前“/ REF = br_rs提取数... \你如何解析这个字符串?
你可以通过/
字拆呢?
irb(main):003:0> "/events/3122671255551936/?ref=br_rs&action_history=null".split("/")[2]
=> "3122671255551936"
您还可以使用String#scan方法来获取数字:
"/events/3122671255551936/?ref=br_rs&action_history=null".scan(/\d+/).join
# => "3122671255551936"
这是很好的,直到查询部分中包含一个数字的参数。查询很容易从服务器端改变,通常没有任何通知。 –
如果字符串是str
:
x = str["/events/".size..-1].to_i
#=> 3122671255551936
如果你希望字符串:
x.to_s
#=> "3122671255551936"
你正在寻找从一个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/"
因此很容易抢值:
的URLuri.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文档。
书写代码将是一个很好的开始... –
你能告诉我们你已经尝试过了吗?这个问题有几种可能的解决方案,具有不同程度的稳定性和难度,我们需要知道你处于什么样的状况以及你能够处理什么。 –
谢谢,你是对的。我曾尝试将字符串分成3部分,只使用第二部分,但提供的答案更好。谢谢你的帮助! – user1683056