我有这样的链接:
http://localhost:3000/sms/receive/sms-id=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&operator-%20id=1&from=37126300682&to=371144&text=RV9+c+Dace+Reituma+0580913
我想从此链接中提取所有不同的变量值。例如sms-id,operator,from,to和text。
到目前为止,我有这样的想法:
的routes.rb
get 'sms/receive/:params', to: 'sms#receive'
SMS#RECEIVE控制器
def receive
query = params[:params]
sms_id= query[/["="].+?[&]/]
flash[:notice] = sms_id
end
这给了我:=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&
但我需要没有第一个=和最后一个字符&
如果我尝试添加类似:query[/["sms-id"].+?[&operator]/]
的字符串,可以让我顺利提取所有变量,则会给出错误:empty range in char class: /["sms-id"].+?[&operator]/
但我相信还有其他方法可以用不同的方式提取所有这些变量值吗?
提前致谢!
答案 0 :(得分:1)
你需要
get 'sms/receive/', to: 'sms#receive'
routes.rb
中的路径,并在控制器中获取params
答案 1 :(得分:1)
正则表达式中的错误是因为-
是中间方括号内的保留字符。在这种情况下,必须使用反斜杠进行转义:\-
。
要解析查询字符串,您可以执行以下操作:
sms_id = params[:params].match(/sms-id=([^&]*)/)[1]
或使用更通用的方法解析它:
parsed_query = Rack::Utils.parse_nested_query(params[:params])
sms_id = parsed_query['sms-id']
(引自this answer)
如果您可以控制初始网址,请更改/
的最后?
,以获得更简单的解决方案:
http://localhost:3000/sms/receive?sms-id=7bb28e244189f2cf36cbebb9d1d4d02001da53ab&operator-%20id=1&from=37126300682&to=371144&text=RV9+c+Dace+Reituma+0580913
您将sms-id
中的params
:
sms_id = params['sms-id']
答案 2 :(得分:0)
试试这个
matches = params[:params].scan(/(?:=)([\w\+]+)(?:\&)?/)
# this will make matches = [[first_match], [second_match], ..., [nth_match]]
# now you can read all matches
sms_id = matches[0][0]
operator_id = matches[1][0]
from = matches[2][0]
to = matches[3][0]
text = matches[4][0]
# and it will not contatin = or &
我建议您在模型或帮助器中创建方法,而不是在控制器中编写整个代码。