URL থেকে ক্যোরিস্ট্রিং সরান


143

জাভাস্ক্রিপ্টের কোনও পথ থেকে ক্যোরিস্ট্রিং সরানোর সহজ উপায় কী? আমি জ্যাকুরির জন্য একটি প্লাগইন দেখেছি যা উইন্ডো.লোকেশন.সার্ক ব্যবহার করে। আমি এটি করতে পারি না: আমার ক্ষেত্রে URL টি একটি পরিবর্তনশীল যা এজেএক্স থেকে সেট করা আছে।

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

উত্তর:


345

এটি পাওয়ার একটি সহজ উপায় হ'ল:

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

যাঁরা হ্যাশটি মুছে ফেলতে চান (মূল প্রশ্নের অংশ নয়) যখন কোনও ক্যুরিস্ট্রিং উপস্থিত নেই , তাদের আরও কিছুটা প্রয়োজন:

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

সম্পাদনা

@ কাউউব (মূলত @ সিআরএল) একটি সহজ কম্বো প্রস্তাব করেছে যা কোয়েরি স্ট্রিং এবং হ্যাশ উভয়ের জন্যই কাজ করে (যদিও এটি রেজিএক্সপ ব্যবহার করে, যদি কারও ক্ষেত্রে সমস্যা হয়):

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

4
+1 ... আসলে বিভাজন () এই ক্ষেত্রে সাবস্ট্রিং () এর চেয়ে ভাল।
ড্যানিয়েল ভ্যাসালো 12

10
প্রান্তিক অপ্টিমাইজেশান যদি এটা (সম্ভবত নয়) গুরুত্বপূর্ণ: split('?', 1)[0]
বোবিনস

@ ক্রিশ্চিয়ানভিয়েলমা: এটি ?একটি স্ট্রিং আক্ষরিক, নিয়মিত প্রকাশ নয়।
রোবস্তো

@ রোবস্তো আমি দুঃখিত, আমার খারাপ ... আমি এটি জাভাতে যাচ্ছিলাম (যা এটি একটি রেজেক্স হিসাবে ব্যাখ্যা করে) :(
খ্রিস্টান ভাইলমা

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

ম্যাক ওএস এক্স 10.6.2 এ ক্রোম 5.0.307.11 এ ফলাফল:

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

দ্রষ্টব্য যে স্ট্রিং পদ্ধতিটি কার্যকারিতা থেকে নিকৃষ্ট, কারণ এটিতে যদি ইউআরএলটিতে কোয়েরিস্ট্রিং না থাকে তবে একটি ফাঁকা স্ট্রিং প্রদান করে। অন্যান্য দুটি পদ্ধতি প্রত্যাশার সাথে সাথে পুরো URL টি ফেরত দেবে। তবে এটি লক্ষ্য করা আকর্ষণীয় যে সাবস্ট্রিং পদ্ধতিটি দ্রুততম, বিশেষত ফায়ারফক্সে।


প্রথম আপডেট: আসলে রোবস্তোর প্রস্তাবিত বিভাজন () পদ্ধতিটি আমার আগে প্রস্তাবিত একটি আরও ভাল সমাধান, যেহেতু কোনও ক্যোরিস্ট্রিং না থাকলেও এটি কাজ করবে:

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
ও_ও আসলেই খুব ব্যাপক, তবে… কেন? সবচেয়ে নমনীয় এবং উপযুক্ত পদ্ধতি স্পষ্টতই জয়ী, গতি এখানে একেবারেই উদ্বেগের নয়।
মিথ্যা

1
@ অনুগ্রহ: কেবল কৌতূহলের জন্য ... এবং কারণ অ্যাঙ্গাসের উত্তরের মন্তব্যে রেজেক্স পদ্ধতির অভিনয় সম্পর্কে তর্ক ছিল।
ড্যানিয়েল ভ্যাসালো

6
খুব মজার, ড্যানিয়েল। এবং যদি আমাকে কখনও কোনও পৃষ্ঠায় 10 কে ইউআরএল বিশ্লেষণ করতে হয় তবে আমি কাজের অন্য লাইনটি অনুসন্ধান করতে যাচ্ছি। :)
রোবস্তো

আমি আসলে কিছুটা দূরে উড়ে এসেছি যে কেউ 44 এমএসে 10 কে রেজেক্স ম্যাচ করতে পারে। ভবিষ্যতে, আমি তাদের আরও ব্যবহার করতে আগ্রহী হবে বলে আমি মনে করি।
TheGerm

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++;। পরীক্ষাগুলি ফিক্স করে, আমার ফায়ারফক্স an.6 এ একটি আইএম্যাক ২.৯৩ গিগাহার্টজ কোর ২ ডুওতে, আমি রেজিএক্সের জন্য ৮ এমএস এবং বিভক্ত পদ্ধতির জন্য 3 এস এম পাই ... তথাপি উত্তরটির জন্য +1, কারণ এটি এখনও অন্য একটি বিকল্প।
ড্যানিয়েল ভ্যাসালো 21

1
ধন্যবাদ - আমি কয়েক মিনিট আগে এটি ঠিক করেছি! - তবে মূল কথাটি হ'ল আপনি যখন রেগ এক্সপ্রেস অপারেশনের জন্যও 0.000005 সেকেন্ডের কথা বলছেন, পারফরম্যান্স কোনও সমাধানের জন্য সমস্যা নয় :-)
প্লডডার

1
match()একটি বস্তু ফেরত দেয় আপনি সম্ভবত এটি চান না। toString()এটি (বা +'') কল করুন ।
বোবিনস

1
বব - ভাল ধরা। আসলে এটি ম্যাচের একটি অ্যারে প্রদান করে - এই ক্ষেত্রে স্ট্রিংগুলির একটি অ্যারে। সুতরাং পরীক্ষার URL.match (নতুন RegExp ("[^?] +")) [0] এটি করেছে
plodder

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

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

2

যদি backbone.js (যা url anchorরুট হিসাবে রয়েছে ) ব্যবহার করে, ইউআরএল 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

@ ব্র্যাড যখন তার সমস্ত কিছু পরে পথের নামটি ফিরিয়ে দিচ্ছে তখন প্রোটোকল কী ব্যাপার?
মূর্খ


-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();
        }
})();

এটিই আমি এটি করেছি, রেগেক্স সমর্থনও রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.