एक यूआरएल पैरामीटर स्ट्रिंग में संख्यात्मक पैरामीटर बढ़ाना?

मैंने एक नज़र डाली है और स्टैक ओवरफ्लो पर मुझे जो चाहिए वह नहीं मिल रहा है, और सोच रहा था कि किसी के पास कोई आसान समाधान है या नहीं।

मैं एक यूआरएल के भीतर एक पैरामीटर खोजना चाहता हूं और इसके मूल्य में वृद्धि करना चाहता हूं, इसलिए, उदाहरण के रूप में:

?kws=&pstc=&cty=&prvnm=1

मैं prvnm पैरामीटर का पता लगाने में सक्षम होना चाहता हूं इससे कोई फर्क नहीं पड़ता कि यह स्ट्रिंग में कहां है और इसके मूल्य को 1 तक बढ़ाएं।

मुझे पता है कि मैं पैरामीटर को सरणी में विभाजित कर सकता हूं, कुंजी ढूंढ सकता हूं, इसे बढ़ा सकता हूं और इसे वापस लिख सकता हूं लेकिन ऐसा लगता है कि किसी और के पास कोई विचार था या नहीं!

0
जोड़ा लेखक the Tin Man, स्रोत
लंबे हवादार? str.split (? और)। मानचित्र {|| ar = s.split (? =); ar [] = अगर ar []; ar.join ()}। शामिल हों() ? वास्तव में, पाठ्यक्रम की कुछ छोटी बिट भरने के बाद, यह बहुत पसंद है
जोड़ा लेखक quetzalcoatl, स्रोत

5 उत्तर

require "uri"

url = "http://example.com/?kws=&pstc=&cty=&prvnm=1"

def new_url(url)
  uri = URI.parse(url)
  hsh = Hash[URI.decode_www_form(uri.query)]
  hsh['prvnm'] = hsh['prvnm'].next
  uri.query = URI.encode_www_form(hsh).to_s
  uri.to_s
end

new_url(url) # => "http://example.com/?kws=&pstc=&cty=&prvnm=2"
3
जोड़ा

पहले से ही चार जवाब हैं, इसलिए मुझे कुछ अलग तरीके से आना पड़ा:

s = "?kws=&pstc=&cty=&prvnm=1"

head, sep, tail = s.partition(/(?<=[?&]prvnm=)\d+/)
head + (sep.to_i + 1).to_s + tail # => "?kws=&pstc=&cty=&prvnm=2"
  • 'String#partition' returns an array of three strings [head, sep, tail], such that head + sep + tail => s, where separator is partition's argument, which can be a string or a regex.
  • We want the separator to be the digits following &prvnm=. We therefore use a regex with \d+ preceeded by the aforementioned string which we want to treat as having zero length, so it will not be included in the separator. That calls for a "positive look-behind": (?<=&prvnm=). \d+ is "greedy", so it take all consequetive digits.
  • For the given value of s, head, sep, tail = s.partition(/(?<=&prvnm=)(\d+)/) => ["?kws=&pstc=&cty=&prvnm=", "1", ""].

Edit: my thanks to @quetzalcoatl for pointing out that I needed to change (?<=&prvnm=) in my regex to what I have now, as what I had would fail when ?prvnm= was at the beginning of the string.

2
जोड़ा
split the string by `&`  
then iterate over the parts  
then split each part by `=` and inspect the results  
  when found `prvnm`, parse the integer and increment it  
  then join the bits by '='  
then join the parts by '&'

या, रेगेक्स का उपयोग करें जैसे:

/[?&]prvnm=\d+/

और परिणाम पार्स करें और फिर एक प्रतिस्थापन करें।

या, कुछ यूआरएल-पार्सिंग लाइब्रेरी प्राप्त करें ..

1
जोड़ा
आपके रेगेक्स में, मुझे विश्वास नहीं है [] या ? कुछ भी करें।
जोड़ा लेखक Cary Swoveland, स्रोत
मेरी गलती। स्पष्टीकरण के लिए आप दोनों को धन्यवाद, और ध्यान देने के लिए quetz करने के लिए मैंने इस गलती को अपने उत्तर में बनाया था (जो मैंने तय किया)।
जोड़ा लेखक Cary Swoveland, स्रोत
एक वर्ण-वर्ग ? के अंदर अपने शाब्दिक अर्थ से बच निकला है, इसलिए [? &] या तो "?" या "और"। इसके बराबर [\? &] है लेकिन हमें भागने की आवश्यकता नहीं है (`\`)।
जोड़ा लेखक the Tin Man, स्रोत
@CarySwoveland: ओह हाँ, वे करते हैं। वे asdasdprvnm के खिलाफ = गार्ड के समान prvnmasdas कुंजी के विरुद्ध गार्ड करते हैं। बेशक, रेगेक्स को कैप्चर ग्रुप जोड़ने या कुछ हिस्सों को पीछे-पीछे या लुक-अग्रेषित करने जैसे चिह्नित करने की ज़रूरत है, लेकिन यह "विचार" का मुद्दा नहीं है।
जोड़ा लेखक quetzalcoatl, स्रोत
@CarySwoveland: शायद आपने ध्यान नहीं दिया कि ? & एक वर्ण समूह के अंदर हैं? btw। यदि आपका URL ? prvnm = 2 और kws = & pstc = & cty = है तो आपका उदाहरण विफल हो जाएगा। यही कारण है कि मैंने एक चार्जर शामिल किया। तुम भी!
जोड़ा लेखक quetzalcoatl, स्रोत

इस तरह कुछ कोशिश करें:

params = "?kws=&pstc=&cty=&prvnm=1"
num = params.scan(/prvnm=(\d)/)[0].join.to_i
puts num + 1
0
जोड़ा

उपयोग:

require 'uri'

फिर:

  1. parsed-url= URI.parse( ur full url)
  2. r = CGI.parse(parsed_url.query)

r is now a hash of all your query parameters.

आप इसे आसानी से एक्सेस कर सकते हैं:

r["prsvn"].to_i + 1
0
जोड़ा
"Ur"? कृपया अपना "सही" वर्तनी करने के लिए समय लें। यह एक ज्ञात तथ्य है कि यदि आप सही ढंग से वर्तनी करने के लिए समय नहीं ले सकते हैं तो लोग जो भी लिखते हैं, उसे अवहेलना करेंगे। इसके अलावा, जानें कि स्टैक ओवरफ़्लो पर स्वरूपण कैसे करें और विराम चिह्न का सही ढंग से उपयोग करें ताकि आपका काम पढ़ना आसान हो। लोग आपको इस तरह की चीजों को अनदेखा करने के लिए कम कर देंगे।
जोड़ा लेखक the Tin Man, स्रोत
आपकी सलाह के लिए धन्यवाद। बस मेरा जवाब संपादित किया। :-)
जोड़ा लेखक Pankhuri Kaushik, स्रोत