क्वेरी को म्यूट करते हुए


19

मुझे पता है कि आपने हमेशा वेब प्रॉक्सी के रूप में जीवन की खुशियों का अनुभव करने के परीक्षणों और क्लेशों के बारे में सोचा है। ईमानदारी से, कौन नहीं है? आज आपको यह लक्ष्य (कम से कम इसका एक हिस्सा) साकार करने का काम सौंपा गया है। वेबसाइट X को दैनिक रूप से बहुत अधिक ट्रैफ़िक मिलता है और वह PaaS की तलाश कर रहा है (स्पष्ट रूप से यह एक सेवा के रूप में प्रॉक्सी को संदर्भित करता है) क्योंकि उपयोगकर्ताओं की बड़ी संख्या जो क्वेरी मापदंडों के माध्यम से संवेदनशील जानकारी को पारित करने पर जोर देते हैं (उपयोगकर्ता मूर्खतापूर्ण हैं)। आपका कार्य अपने मूल गंतव्य के माध्यम से अनुरोध को अग्रेषित करने से पहले अनुरोध से किसी भी और सभी संवेदनशील क्वेरी पैरामीटर को निकालना है।

इनपुट

  • एक अच्छी तरह से गठित पूर्ण HTTP URL जो RFC3986 धारा 3 में URI व्याकरण का अनुसरण करता है ।
    • आप मान सकते हैं कि कोई टुकड़ा नहीं है
    • संक्षिप्त प्रारूप उदाहरण जहां वर्ग कोष्ठक में कुछ भी वैकल्पिक को दर्शाता है: http[s]://[user:pass@]host.name.com[:port]/[?param1=value1&param2=value2...]
  • हटाए जाने वाले क्वेरी मापदंडों की एक सूची।

उत्पादन

इनपुट सूची में परिभाषित मापदंडों के बिना संशोधित HTTP URL।

उदाहरण

http://example.com/ [foo]
> http://example.com/

http://example.com/?foo=bar []
> http://example.com/?foo=bar

http://example.com/ []
> http://example.com/

http://example.com/?foo=1&bar=2&baz=3 [foo,baz]
> http://example.com/?bar=2

http://example.com/?foo=1&bar=2&baz=3 [foo,bar,baz]
> http://example.com/

http://example.com/?foo&bar=2&baz= [foo,baz]
> http://example.com/?bar=2

http://example.com/?abc=1&def=2&baz=foo [foo,bar]
> http://example.com/?abc=1&def=2&baz=foo

http://example.com/?foobar=baz [foo]
> http://example.com/?foobar=baz

http://foo:foo@foo.com:8080/?foo=1&bar=foo [foo]
> http://foo:foo@foo.com:8080/?bar=foo

स्कोरिंग

यह , इसलिए सबसे छोटा उत्तर (बाइट्स में) जीतता है।


1
क्या मुझे अलग-अलग लाइनों पर URL और क्वेरी पैरामीटर मिल सकते हैं?
शीशमारा

1
&मापदंडों के बीच के अलावा कहीं भी दिखाई दे सकता है ?
रिले

यह भी कर सकते हैं जैसे पासवर्ड एक कर सकते हैं ?? क्या यह आदेश भी उसी तरह रखा जाना चाहिए जैसा वह था?
कार्लकैस्टर

@ रिले संख्या यदि &क्वेरी पैरामीटर का हिस्सा है तो इसे सही तरीके से urlencoded किया जाना चाहिए%26
Poke

1
जाहिरा तौर पर, http://foo:&foo=x@foo.com:8080/?foo=1&bar=fooRFC द्वारा अनुमति है। यह मौजूदा समाधानों का एक गुच्छा तोड़ना चाहिए। : D (नियम userinfo को अनारक्षित या pct- एस्केप या सब-डेलिम्स के रूप में विस्तारित किया जा सकता है, और उप-डेलिम्स हो सकता है &और =)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

जवाबों:


6

GNU sed 98 96 88 80 77 74 69 59 54 (48 + 1 for -r) 49

:;s,(.+)(=[^&]*[& ]|&)(.*)\1,\3 ,
t;s,[?&]? .*,,

हटाने के लिए मापदंडों की सूची को रिक्त स्थान द्वारा अलग किया जाता है।

$ echo 'http://example.com/?foo=1&bar=2&baz=3 foo bar baz' | sed -rf sed.txt
http://example.com/

$ echo 'http://example.com/?foo&bar=2&baz= foo baz' | sed -rf sed.txt
http://example.com/?bar=2

$ echo 'http://example.com/' | sed -rf sed.txt
http://example.com/

आपके वर्तमान कोड संपादन में, ओपी के प्रश्न के कई परीक्षण परिणामी URL में एक अनुगामी &या ?चरित्र देते हैं ।
शीशमारा

@ शीशमौरा मुझे यकीन नहीं है कि मैं कैसे चूक गया ... सौभाग्य से यह केवल 1 बाइट अंतर है।
रिले

आपके संपादित इतिहास में 96, 77 और 59 बाइट कोड संस्करण नहीं पाए गए हैं। एडिट 7 टाइटल को 6 एडिट की तुलना में 10 बाइट्स कम दिखाया गया, लेकिन कोड नहीं बदला गया था। मैं हालांकि, महान गोल्फ हूँ!
शशमौरा

1
@seshoumara मुझे लगता है कि उन्होंने कुछ संपादन संयुक्त किए क्योंकि वे मामूली थे (बस कुछ वर्णों को हटा रहे थे)।
रिले

@ शीशमौरा मुझे लगता है कि यह वास्तव में उन्हें मिला हुआ है क्योंकि मैंने एक दूसरे के 5 मिनट के भीतर कई संपादन किए हैं।
रिले

5

जावास्क्रिप्ट (ईएस 6), 62 60 बाइट्स

f=
(s,a,u=new URL(s))=>a.map(e=>u.searchParams.delete(e))&&''+u
;
s.value=document.URL;
<div oninput=o.textContent=f(s.value,a.value.split`\n`)><input id=s><br><textarea id=a></textarea><pre id=o>

संपादित करें: @ बस्ती के लिए 2 बाइट्स सहेजे गए।


आप .hrefअंत में ड्रॉप करके 5 बाइट बचा सकते हैं ।
झबरा

@ शगुन जो एक स्ट्रिंग नहीं लौटाएगा ... मैं मान रहा था कि अनुमति नहीं थी।
नील

यह निर्भर करता है कि आप इसे कैसे आउटपुट करते हैं। उदाहरण के लिए, यदि आप alertइसे (पाठ) नोड में सम्मिलित करते हैं या इसका उपयोग करते हैं, तो आपके पास, यह आपको hrefऑब्जेक्ट की संपत्ति देगा । यदि आप इसे कंसोल में लॉग इन करते हैं, हालांकि, यह आपको पूरी वस्तु देगा। इस फिडल को देखें ।
झबरा

1
@ शैगी आह, तो मैं निश्चित रूप से 2 बाइट्स को स्ट्रिंग करके बचा सकता हूं, धन्यवाद।
नील

3

PHP, 90 बाइट्स

<?=trim(preg_replace("#(?<=\?|&)(".join("|",$_GET[r]).")(=.*)?(&|$)#U","",$_GET[u]),"?&");

-11 बाइट्स अगर? या अंत में अनुमति दी है

पिछला संस्करण 140 बाइट्स

<?=substr($u=$_GET[u],0,strpos($u,"?")+!!$j=join("&",preg_grep("#^(".join("|",$_GET[r]).")(=|$)#",explode("&",parse_url($u)[query]),1))).$j;

+2 बाइट्स: विकल्प को छोटा किया जाना चाहिए, या ^/ (.*|$)पहले / अंतिम विकल्प का हिस्सा होगा।
टाइटस

-2 बाइट्स: निकालें .*या (-5) से प्रतिस्थापित (=.*|$)करें \b
टाइटस

आपका regexp दिखेगा की तरह #^foo|bar(=.*|$)#जो के समान है #(^foo)|(bar=.*|bar$))#। लेकिन यह होना चाहिए #(foo|bar)(=.*|$)#
टाइटस

@ टिट्स तुम सही हो मेरी गलती है
Jörg Hülsermann

अच्छा! मैं जोर के बारे में नहीं सोचा था; यही कारण है कि मैं वापस गिर गया array_map(और मुझे आश्चर्य था कि यह कितना छोटा हो सकता है)।
टाइटस

2

PHP, 120 110 बाइट्स

preg_replace और सरणी फ़ंक्शन के साथ: ( Jörg से प्रेरित )

<?=preg_replace(array_map(function($s){return"#(\\?|&)$s(=.*)?(&|$)#U";},array_slice($argv,2)),"\1",$argv[1]);

फ़ाइल के साथ सहेजें, कॉल करें php <scriptname> <uri> <parametername> <parametername> ...

parse_str और http_build_query (120 बाइट्स) के साथ:

parse_str(end($u=explode('?',$argv[1])),$a);for($i=$argc;$i-->1;)unset($a[$argv[$i]]);echo"$u[0]?".http_build_query($a);

साथ दौड़ो php -r <code> <uri> <parametername> <parametername> ...


parse_str? http_build_query? मैं किसी के लिए सही उपकरण का उपयोग करके काम करते हुए बहुत खुश हूँ, यहां तक ​​कि कोड गोल्फ में भी। बीज़ URL / SQL क्वेरी / regexp / HTML से उत्पन्न होने वाले कीड़े "बस स्ट्रिंग्स" हैं, क्योंकि वे आसानी से उपलब्ध हैं।
देरडेमंड्ट

शायद अधिक प्रेरणा के लिए। मैं आपको मिल गया
Jörg Hülsermann

@ लियोन क्या आपके पास मुझे घूरने से बेहतर कुछ नहीं है?
टाइटस

2

जावा 7, 127 बाइट्स

String a(String a,String[]b){for(String c:b)a=a.replaceAll("(?<=[?&])"+c+"(=[^&]*)?(&|$)","");return a.replaceAll("[?&]$","");}

व्याख्या

String sanitize(String url, String[] params) {
    for (String param : params) {
        // please don't modify function parameters in real code
        url=url.replaceAll("(?<=[?&])" // Look for a leading ? or & but don't consume it
            + param                    // Consume the key of the query param (assuming key=value syntax)
            + "(=[^&]*)?"              // Consume the value of the query param if it exists
            + "(&|$)","");             // Consume the trailing & unless we're at the end of the url and replace with nothing
    }
    url = url.replaceAll("[?&]$",""); // If we remove all of the params then we'll have a trailing ? which needs to be removed
                                      // If we remove the last param only then we could have a trailing & which also needs to be removed
                                      // We will only run into one of these scenarios
    return url;
}

Ideone


यह मेरे लिए आपके चौथे, 5 वें, 6 वें और 9 वें उदाहरणों का उपयोग करने में विफल रहता है, लेकिन मैं जावा 8 का उपयोग कर रहा हूं, हालांकि यह हो सकता है। यद्यपि C # समतुल्य की कोशिश की और यह समान मामलों में विफल रहा, इसलिए idunno।
योडल

1
कोई बात नहीं, जिस तरह से मैं यह परीक्षण कर रहा था गड़बड़ कर दिया।
योडल

2

C #, 377 336 330 328 बाइट्स (173 alt)

string n(string u,string[]r){var s=u.Split('?');if(s.Length<2)return u;var a=s[1].Contains("&")?s[1].Split('&'):new string[]{s[1]};int B=a.Length,i=0,C=i,c=B;for(;i<B;i++)foreach(var R in r)if(R==a[i].Split('=')[0]){a[i]="";c--;}var t=s[0];t+=c>0?"?":"";for(i=0;i<a.Length;i++)if(a[i]!=""){t+=a[i];C++;if(C!=c)t+="&";}return t;}

पूरा कार्यक्रम:

using System;
class a
{
    static void Main()
    {
        string input = Console.ReadLine();
        string url = input.Split(' ')[0];
        string r = input.Split(' ')[1];
        r = r.Replace("[", "").Replace("]","");
        string[] remove = r.Split(',');
        a b = new a();
        Console.WriteLine(b.n(url, remove));
    }
    string n(string u,string[]r)
    {
        var s=u.Split('?');
        if(s.Length<2)return u;
        var a=s[1].Contains("&")?s[1].Split('&'):new string[]{s[1]};
        int B=a.Length,i=0,C=i,c=B;
        for(;i<B;i++)
            foreach(var R in r)
                if(R==a[i].Split('=')[0])
                {
                    a[i]="";
                    c--;
                }
        var t=s[0];
        t+=c>0?"?":"";
        for(i=0;i<a.Length;i++)
            if(a[i]!="")
            {
                t+=a[i];
                C++;
                if (C!=c)t+="&";
            }
        return t;
    }
}

शायद बहुत कुशल नहीं है, लेकिन यह मेरे विचार से काम करता है।

वैकल्पिक रूप से, जावा से @ पोक विधि का उपयोग करके 173 बाइट समाधान है। हालांकि रेगेक्स के लिए एक आयात की आवश्यकता होती है, इसलिए शायद कम नहीं हो सकता।

using System.Text.RegularExpressions;string m(string a,string[]b){foreach(var c in b)a=Regex.Replace(a,$"(?<=[?&]){c}(=[^&]*)?(&|$)","");return Regex.Replace(a,"[?&]$","");}

2

रूबी, 146 140 127 119 116 113 बाइट्स

संपादित करें 2: का उपयोग करके 6 बाइट्स बचा लिया $1, $2और $*, और बदलकर 7 x.split("=")[0]को x[/\w+/]
संपादित 3: का उपयोग करके 6 बाइट्स बचाया *बजाय .joinअनावश्यक रिक्त स्थान से 2 बाइट्स, बचाया
बराबर करने के लिए इनलाइन (बदला regex को पुन: द्वारा बचाया 3 बाइट्स: संपादित करें 4 $*[1][/([^?]*)\??(.*)/,1]और पुट के रूप में a) को सौंपा
5: संपादित 3 बाइट्स के ($*[2].scan(r=/\w+/)&[x[r]])[0]बजाय का उपयोग करके बचाया$*[2].scan(r=/\w+/).include?(x[r])

इसे चलाते समय प्रोग्राम को इनपुट मानते हुए:

a,b=$*[1][/([^?]*)\??(.*)/,1],$2.split("&").reject{|x|($*[2].scan(r=/\w+/)&[x[r]])[0]}*"&"
puts(b[0] ?a+"?"+b: a)

व्याख्या

a,b=$*[1][/([^?]*)\??(.*)/,1],$2.split("&")

यह कमांड लाइन पर दिए गए URL को पार्स करता है, और मैचों को $1और में संग्रहीत करता है $2$*[1][/([^?]*)\??(.*)/,1]पहला मैच अंदर स्टोर करने के लिए भी लौटाता है a, जबकि दूसरे मैच $2 को $ 1 के अंक के रूप में संदर्भित किया जाता है , और bसरणियों के एक सरणी में पार्स ...

.reject { |x|

... यह सब खारिज करते हुए ...

    ($*[2].scan(r=/\w+/)&[x[r]])[0]

... '=' से पहले एक स्ट्रिंग है जो दूसरे पैरामीटर द्वारा दिए गए नामों की सूची में शामिल है ... यह काम करता है क्योंकि हम शब्दों के लिए स्कैन करते हैं (सूची प्राप्त करने के लिए) तो इससे पहले शब्द प्राप्त करें =, और देखें कि क्या यह शब्द सूची में है &। चूंकि &"नहीं मिला" (शून्य सेट) पर एक खाली सरणी देता है, इसलिए हम nilसरणी में कोई तत्व नहीं होने पर प्राप्त करने के लिए नीचे बताए गए ट्रिक का उपयोग करते हैं। अन्यथा हम एक स्ट्रिंग लौटाते हैं, जो सत्य के रूप में गिना जाता है, जो उस स्ट्रिंग को अस्वीकार करता है।

}*"&"

... और शेष तार को 'और' के साथ मिलाएँ

इस बिंदु पर, bURL के लिए GET क्वेरी स्ट्रिंग है। इस प्रकार, हमें इसे मुद्रित करने की आवश्यकता है।

puts(b[0] ?a+"?"+b: a)

यह माणिक में एक चाल का उपयोग करता है। b[0]होगा nilयदि b एक खाली सरणी या स्ट्रिंग है। तो अगर इसकी सच्चाई , (नहीं nilया false) है, तो सरणी में कम से कम एक तत्व है, इसलिए हमें डालने की आवश्यकता हैa+"?"+b सही URL के । अन्यथा, हम सिर्फ कहते हैंa , क्योंकि दिखाने के लिए कोई पैरामीटर नहीं हैं

नोट: यह उत्तर मानता है कि ? नहीं कर सकता क्वेरी से URL को हटाने के अलावा कहीं भी प्रकट । (मैं जो जुड़ा हुआ आरएफसी से पढ़ता हूं उसके अनुसार)

इसके अलावा, यह मेरा पहला गोल्फ जवाब है: डी


2
PPCG में आपका स्वागत है!
एक्रोलिथ

1

रंज , 46 बाइट्स

कमांड-लाइन आर्ग्स से हटाने के लिए स्टैडेन से URL और क्वेरी पैरामीटर्स लेता है।

YgqR`\?.+`{s:J_@`^[^=]+`NIyFI@>a^'&[s&'?sJ'&]}

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

 g               Local variable containing list of cmdline args
Y                Yank into global variable y so it's available inside the function
  q              Grab a line of stdin
   R`\?.+`{...}  Do a regex replace of everything from ? on, using a callback function:

s:J_@`^[^=]+`NIyFI@>a^'&[s&'?sJ'&]
                  @>a^'&            All but 1st char of match, split on &
                FI                  Filter on this function:
   _@`^[^=]+`                         Regex match: run of non = from beginning of string
                                      @ returns a list (here, of one item), so...
  J                                   Join to get a scalar
             NIy                      True if match not in y; false if in y
s:                                  Assign the filtered list to s
                        [        ]  Return a list containing:
                         s&'?       ? if s is nonempty, [] otherwise
                             sJ'&   s joined on &
                                    When used as a replacement, a list is first stringified
                                    (which, in the absence of flags, means concatenated)

1

PowerShell v3 +, 115 90 बाइट्स

param($n,$z)$a,$b=$n-split'\?';($z|%{$b=$b-replace"(^|&)$_(=[^&]*)?(&|$)"});$a+"?"*!!$b+$b

हटाने के लिए पैरामीटर के $nरूप में URL के रूप में इनपुट और $zस्ट्रिंग के शाब्दिक सरणी के रूप में लेता है । -splitइनपुट URL पर है ?, पहली छमाही में $aऔर दूसरी में संग्रहीत करता है $b

इसके बाद, $bलूप के माध्यम से फिर से तैयार किया जाता है $z, -replaceउन्हें हटाने के लिए प्रत्येक प्रतिबंधित क्वेरी शब्द पर एक रेग्क्स का प्रदर्शन किया जाता है। फिर, आउटपुट $a(अनमॉडिफ़ाइड), प्लस /इस बात पर निर्भर करता है कि क्या $bमौजूद है, और ?क्या $xमौजूद है, इसके अलावा प्लस $ x है।


1

पायथ - 27 बाइट्स

जब वह बिलिन को बदलने और फिर पलटने की बात करता था, तो केनी सही था, हालांकि यह बहुत मुश्किल से सही होगा।

.sjK\?mj\&f!}hcT\=Qcd\&czKK

टेस्ट सूट


1

रेटिना , 44 48 बाइट्स

क्रॉस-आउट 44 अभी भी 44 है। फिक्स के लिए मार्टिन को धन्यवाद।

[?&](?>([^ =&]+))[^ &]*(?=.* \1( |$))| .*

/&
/?

जैसे इनपुट लेता है uri param1 param2इसे ऑनलाइन आज़माएं!

व्याख्या

पहला प्रतिस्थापन क्वेरी स्ट्रिंग से उपयुक्त पैरामीटर हटाता है। या , एक पूर्ण पैरामीटर नाम से [?&](?>([^ =&+))[^ &]*मेल खाता है , और (वैकल्पिक रूप से)?&= और एक मूल्य से पैरामीटर नाम को कैप्चर समूह 1 में संग्रहीत करता है। फिर(?=.* \1( |$)) एक लुकहेड है जो यह जांचता है कि क्या पैरामीटर का नाम हटाने के लिए पैरामीटर की सूची में दिखाई देता है। यदि कोई पैरामीटर इन शर्तों से मेल खाता है, तो इसे हटा दिया जाता है (एक खाली प्रतिस्थापन के साथ प्रतिस्थापित)।

पदार्थ गैर-अतिव्यापी हैं (लुकहेड के लिए धन्यवाद) और बाएं से दाएं आगे बढ़ते हैं। URL के अंत तक पहुँचने पर, .* शाखा इसे हटाने और हटाने के लिए मापदंडों की सूची से मेल खाती है।

दूसरा प्रतिस्थापन सिर्फ यह सुनिश्चित करता है कि नया क्वेरी स्ट्रिंग शुरू होता है ?यदि पहला पैरामीटर हटा दिया गया था।


मुझे लगता है कि यह भी मापदंडों को हटा देता है यदि उनमें से एक उपसर्ग अंत में सूची में दिखाई देता है (उदाहरण के लिए retina.tryitonline.net/… )। इसे ठीक करने का एक तरीका समूह 1 को लपेटना है (?>...)
मार्टिन एंडर

@MartinEnder टिल नॉन-बैकट्रैकिंग सबएक्सप्रेस के बारे में। धन्यवाद!
DLosc

0

जावा 7, 203 बाइट्स

String f(String u,List p)throws Exception{String[]g=u.split("\\?",2);String s="";if(g.length>1)for(String q:g[1].split("&")){if(p.indexOf(q.split("=")[0])<0){s+=s.isEmpty()?"?":"&";s+=q;}}return g[0]+s;}

Ungolfed:

  String f(String u, List p) throws Exception {
    String[] g = u.split("\\?", 2);
    String s = "";
    if (g.length > 1) for (String q : g[1].split("&")) {
      if (p.indexOf(q.split("=")[0]) < 0) {
        s += s.isEmpty() ? "?" : "&";
        s += q;
      }
    }
    return g[0] + s;
  }

यह फ़ंक्शन सभी परीक्षणों से गुजरता है।


0

पायथन, 75 81 112 बाइट्स:

def Z(A,S):import re;F=A.rindex('/');print A[:F]+re.sub('|'.join(i+'(=\d?|&)&?'for i in S),'',A[F:]).strip('&?')

एक नामांकित क्रिया। प्रारूप में इनपुट लेता है

D(<String>,<Array>)

और एक स्ट्रिंग आउटपुट करता है।

सभी टेस्ट मामलों के साथ प्रतिकृति।


0

PHP, प्रतिस्पर्धा नहीं

हेक, पीएचपी इसके लिए बनाई गई थी; वास्तविक URL का उपयोग क्यों नहीं किया जाता है?

<?foreach($_GET[x]as$w)unset($_GET[$w]);
echo http,s[$_SERVER[SERVER_PORT]-443],"://",
$u=$_SERVER[PHP_AUTH_USER],($p=$_SERVER[PHP_AUTH_PW])?":$p":"","@"[!$u&!$p],
"$_SERVER[HTTP_HOST]$_SERVER[SCRIPT_NAME]?",http_build_query($_GET);

फ़ाइल को सहेजें, अपने वांछित क्वेरी स्ट्रिंग के साथ कॉल करें &x[]=x&x[]=<exclude1>&x[]=<exclude2>&...

उपयोगकर्ता नाम और पासवर्ड पर असफल हो सकते हैं (आपके ब्राउज़र को हटाने के आधार पर उन्हें हटा दिया जाता है या नहीं)।
विल असफल हो पासवर्ड है 0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.