URL से क्वेरिस्ट्रिंग निकालें


145

जावास्क्रिप्ट में एक पथ से क्लेरीस्ट्रिंग को हटाने का एक आसान तरीका क्या है? मैंने Jquery के लिए एक प्लगइन देखा है जो window.location.search का उपयोग करता है। मैं ऐसा नहीं कर सकता: मेरे मामले में URL एक वैरिएबल है जो AJAX से सेट किया गया है।

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3&SortOrder=dsc'

जवाबों:


347

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

function getPathFromUrl(url) {
  return url.split("?")[0];
}

उन लोगों के लिए भी जो हैश को हटाना चाहते हैं (मूल प्रश्न का हिस्सा नहीं) जब कोई क्वेरिस्ट्रिंग मौजूद नहीं होता है , जिसके लिए थोड़ी सी आवश्यकता होती है:

function stripQueryStringAndHashFromPath(url) {
  return url.split("?")[0].split("#")[0];
}

संपादित करें

@Kub (मूल रूप से @crl) ने एक सरल कॉम्बो का सुझाव दिया जो क्वेरी स्ट्रिंग और हैश दोनों के लिए काम करता है (हालांकि यह RegExp का उपयोग करता है, अगर किसी को उस के साथ कोई समस्या है):

function getPathFromUrl(url) {
  return url.split(/[?#]/)[0];
}

4
+1 ... वास्तव में विभाजन () इस मामले में प्रतिस्थापन () से बेहतर है।
डैनियल वेसलो

10
सीमांत अनुकूलन यदि यह मायने रखता है (शायद नहीं) split('?', 1)[0]:।
बोबिन्स

@ChristianVielma: यह ?एक स्ट्रिंग शाब्दिक है, न कि एक नियमित अभिव्यक्ति।
राबर्टो

@ रॉबस्टो मैं क्षमा चाहता हूँ, मेरा बुरा ... मैं इसे जावा में जाँच रहा था (जो इसे एक
रेक्स के

4
हे रोबस्टो, और क्यों नहीं .split(/[?#]/)[0]?
बजे

32

दूसरा अद्यतन: एक व्यापक उत्तर प्रदान करने के प्रयास में, मैं विभिन्न उत्तरों में प्रस्तावित तीन विधियों को बेंचमार्किंग कर रहा हूँ।

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
var i;

// Testing the substring method
i = 0;
console.time('10k substring');
while (i < 10000) {
    testURL.substring(0, testURL.indexOf('?'));
    i++;
}
console.timeEnd('10k substring');

// Testing the split method
i = 0;
console.time('10k split');
while (i < 10000) {
    testURL.split('?')[0]; 
    i++;
}
console.timeEnd('10k split');

// Testing the RegEx method
i = 0;
var re = new RegExp("[^?]+");
console.time('10k regex');
while (i < 10000) {
    testURL.match(re)[0]; 
    i++;
}
console.timeEnd('10k regex');

मैक ओएस एक्स 10.6.2 पर फ़ायरफ़ॉक्स 3.5.8 में परिणाम:

10k substring:  16ms
10k split:      25ms
10k regex:      44ms

Mac OS X 10.6.2 पर Chrome 5.0.307.11 में परिणाम:

10k substring:  14ms
10k split:      20ms
10k regex:      15ms

ध्यान दें कि सबस्ट्रिंग विधि कार्यक्षमता में हीन है क्योंकि यह एक रिक्त स्ट्रिंग लौटाता है यदि URL में क्वेरिस्ट्रिंग नहीं है। अन्य दो विधियाँ उम्मीद के मुताबिक पूरा URL लौटा देंगी। हालांकि यह ध्यान रखना दिलचस्प है कि प्रतिस्थापन विधि सबसे तेज़ है, खासकर फ़ायरफ़ॉक्स में।


1 अद्यतन: वास्तव में रोबस्टो द्वारा सुझाई गई विभाजन () विधि एक बेहतर समाधान है, जिसे मैंने पहले सुझाया था, क्योंकि यह तब भी काम करेगा जब कोई झंझट न हो।

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.split('?')[0];    // Returns: "/Products/List"

var testURL2 = '/Products/List';
testURL2.split('?')[0];    // Returns: "/Products/List"

मूल उत्तर:

var testURL = '/Products/List?SortDirection=dsc&Sort=price&Page=3&Page2=3';
testURL.substring(0, testURL.indexOf('?'));    // Returns: "/Products/List"

10
O_O वास्तव में बहुत व्यापक है, लेकिन ... क्यों? सबसे लचीला और उपयुक्त तरीका स्पष्ट रूप से जीतता है, गति यहां बिल्कुल चिंता का विषय नहीं है।
deceze

1
@ डिसेज़: सिर्फ जिज्ञासा के लिए ... और क्योंकि एंगस के उत्तर की टिप्पणियों में रेगेक्स विधि के प्रदर्शन के बारे में एक तर्क था।
डैनियल वेसलो

6
बहुत दिलचस्प, डैनियल। और अगर मुझे कभी भी एक पृष्ठ पर 10K URL पार्स करना है तो मैं एक और काम करने जा रहा हूँ। :)
रोबस्टो

मैं वास्तव में थोड़ा उड़ा रहा हूं कि कोई 44 में 10k रेगेक्स मैच कर सकता है। भविष्य में, मुझे लगता है कि मैं उन्हें और अधिक उपयोग करने के लिए इच्छुक हूं।
18

12

यह एक पुराना प्रश्न हो सकता है, लेकिन मैंने क्वेरी पाराम को हटाने के लिए यह तरीका आजमाया है। मेरे लिए सुचारू रूप से काम करने लगता है क्योंकि मुझे फिर से लोड करने की आवश्यकता थी और साथ ही साथ क्वेरी पारम्स को हटाने की आवश्यकता थी।

window.location.href = window.location.origin + window.location.pathname;

इसके अलावा जब से मैं सरल स्ट्रिंग जोड़ ऑपरेशन का उपयोग कर रहा हूं मुझे लगता है कि प्रदर्शन अच्छा होगा। लेकिन फिर भी इस जवाब में स्निपेट्स के साथ तुलना करने के लायक है


3

एक सरल तरीका यह है कि आप निम्नानुसार कर सकते हैं

public static String stripQueryStringAndHashFromPath(String uri) {
 return uri.replaceAll(("(\\?.*|\\#.*)"), "");
}

2

यदि आप RegEx में हैं ...।

var newURL = testURL.match(new RegExp("[^?]+"))

1
regexp एक धीमा है - आसान तेज़ तरीके से जाएं।
अरस्तू

1
@ एंगस: आपका लूप आपको "एक स्क्रिप्ट व्यस्त हो सकता है ..." दे रहा है क्योंकि आप वेतन वृद्धि भूल गए हैं a++;। परीक्षणों को ठीक करते हुए, एक iMac 2.93Ghz कोर 2 डुओ पर मेरे फ़ायरफ़ॉक्स 3.6 में, मुझे RegEx के लिए 8ms और विभाजन विधि के लिए 3ms मिलते हैं ... उत्तर के लिए फिर भी +1, क्योंकि यह अभी भी एक अन्य विकल्प है।
डैनियल वेसलो

1
धन्यवाद - मैंने कुछ मिनट पहले इसे ठीक किया! - लेकिन बात यह है कि जब आप reg एक्सप ऑपरेशन के लिए भी 0.000005 सेकंड बात कर रहे हैं, तो प्रदर्शन किसी भी समाधान के लिए कोई समस्या नहीं है :-)
plodder

1
match()कोई वस्तु लौटाता है। आप शायद ऐसा नहीं चाहते। इस पर कॉल करें toString()(या +'')।
बोबिन्स

1
बॉब - अच्छी पकड़। वास्तव में यह मैचों की एक सरणी देता है - इस मामले में तारों का एक सरणी। तो testURL.match (नया RegExp ("[^?] +")) [0] करता है
प्लॉडर

2
var path = "path/to/myfile.png?foo=bar#hash";

console.log(
    path.replace(/(\?.*)|(#.*)/g, "")
);

2

यदि backbone.js (जिसमें url anchorरूट शामिल है ) का उपयोग करते हुए , url query stringदिखाई दे सकता है:

  1. पहले url anchor:

    var url = 'http://example.com?a=1&b=3#routepath/subpath';
  2. के बाद url anchor:

    var url = 'http://example.com#routepath/subpath?a=1&b=3';

उपाय:

window.location.href.replace(window.location.search, '');
// run as: 'http://example.com#routepath/subpath?a=1&b=3'.replace('?a=1&b=3', '');

1

मानक का उपयोग कर एक दृष्टिकोण URL:

/**
 * @param {string} path - A path starting with "/"
 * @return {string}
 */
function getPathname(path) {
  return new URL(`http://_${path}`).pathname
}

getPathname('/foo/bar?cat=5') // /foo/bar

@ ब्रैड प्रोटोकॉल क्या मायने रखता है जब वह सब करता है वह बाद में pathname वापस कर रहा है?
मूर्ख


-3
(() => {
        'use strict';
        const needle = 'SortOrder|Page'; // example
        if ( needle === '' || needle === '{{1}}' ) { 
            return; 
        }           
        const needles = needle.split(/\s*\|\s*/);
        const querystripper = ev => {
                    if (ev) { window.removeEventListener(ev.type, querystripper, true);}
                    try {
                          const url = new URL(location.href);
                          const params = new URLSearchParams(url.search.slice(1));
                          for (const needleremover of needles) {
                                if (params.has(needleremover)) {
                                url.searchParams.delete(needleremover);
                                    window.location.href = url;
                            }
                          }     
                    } catch (ex) { }
        };          
        if (document.readyState === 'loading') {
                 window.addEventListener('DOMContentLoaded', querystripper, true);
        } else {
                 querystripper();
        }
})();

मैंने इसे कैसे किया, इसका भी RegEx समर्थन है।

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