知道它的位置从字符串中获取文本?

时间:2014-01-13 17:04:05

标签: ruby json string

我获取HTML页面的源代码并将其放在字符串中。

我想要做的是获取驻留在源代码中不同时间的JavaScript函数的“参数”。我想得到第一个结果。

这是函数的示例,其中?表示我想要的文本的字符:

asdf({"id":?????,"uid":"?????","user":{"username":"?????","permalink":"?????"}});

"uid":字符串具有可变长度和字符时,如何在"uid":"????" "?"后获取字符串?

例如,我想从该字符串中获取文本eD9od0fopdh5,知道它位于文本"uid":之后。

asdf({"id":128999175,"uid":"eD9od0fopdh5","user":{"username":"sportshistory","permalink":"sportshistory"}})

3 个答案:

答案 0 :(得分:1)

由于您在 ruby​​ 中使用JSON哈希作为字符串,因此当您不想使用任何外部gem时,shell将获得uid,如下所示:

string = 'asdf({"id":128999175,"uid":"eD9od0fopdh5","user":{"username":"sportshistory","p‌​ermalink":"sportshistory"}})'
uid = string =~ /"uid":"([a-zA-Z0-9]+)"/ && $1
"eD9od0fopdh5"

答案 1 :(得分:1)

您可以从json构建哈希

require 'json'

str= 'window.push({"id":"X","uid":"X","user":{"username":"X","permalink":"X"}});'
json_str= str[12..-3]
p json_str
hash= JSON.parse(json_str)
p hash['uid']

答案 2 :(得分:1)

我会这样做:

require 'json'

str = 'asdf({"id":128999175,"uid":"eD9od0fopdh5","user":{"username":"sportshistory","permalink":"sportshistory"}})'
data = str[/\((.+)\)/, 1]
# => "{\"id\":128999175,\"uid\":\"eD9od0fopdh5\",\"user\":{\"username\":\"sportshistory\",\"permalink\":\"sportshistory\"}}"

params = JSON.parse(data)
# => {"id"=>128999175,
#     "uid"=>"eD9od0fopdh5",
#     "user"=>{"username"=>"sportshistory", "permalink"=>"sportshistory"}}

params['uid'] # => "eD9od0fopdh5"

那会得到它。

如果你想改变它:

params['uid'] = 'foo'

params # => {"id"=>128999175, "uid"=>"foo", "user"=>{"username"=>"sportshistory", "permalink"=>"sportshistory"}}

如果你想再次使用JSON:

params.to_json # => "{\"id\":128999175,\"uid\":\"foo\",\"user\":{\"username\":\"sportshistory\",\"permalink\":\"sportshistory\"}}"

我使用data = str[/\((.+)\)/, 1]的原因是它会原谅参数大小或顺序的变化。只要数据包含在JavaScript函数的参数中,模式就会将其拾取。