আমি কীভাবে পিএইচপি এর প্রিগ_ম্যাচ_সামগ্রী () এর অনুরূপ জাভাস্ক্রিপ্টে একটি রেইজেক্সের সাথে একাধিক ঘটনার সাথে মিল রাখতে পারি?


160

আমি ইউআরএল-এনকোডযুক্ত স্ট্রিংগুলি পার্স করার চেষ্টা করছি যা কী &বা মান জোড় দিয়ে বা পৃথক পৃথক দ্বারা তৈরি &

নিম্নলিখিতগুলি কেবল প্রথম ঘটনার সাথে মিলবে, কীগুলি এবং মানগুলিকে পৃথক ফলাফলের উপাদানগুলিতে পৃথক করে:

var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)

স্ট্রিংয়ের জন্য '1111342 = অ্যাডাম% 20 ফ্র্যাঙ্কো এবং 348572 = বব% 20 জোনস' এর ফলাফলগুলি হবে:

['1111342', 'Adam%20Franco']

গ্লোবাল ফ্ল্যাগ, 'জি' ব্যবহার করে সমস্ত উপস্থিতি মেলে তবে পৃথক কী এবং মানগুলি না দিয়ে কেবল সম্পূর্ণ মেলে সাব-স্ট্রিংগুলি প্রদান করবে:

var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)

স্ট্রিংয়ের জন্য '1111342 = অ্যাডাম% 20 ফ্র্যাঙ্কো এবং 348572 = বব% 20 জোনস' এর ফলাফলগুলি হবে:

['1111342=Adam%20Franco', '&348572=Bob%20Jones']

আমি স্ট্রিংটি বিভক্ত করতে &এবং প্রতিটি কী / মান জুটি পৃথক পৃথকভাবে ভেঙে ফেলতে পারলাম , /(?:&|&)?([^=]+)=([^&]+)/পিএইচপি এর preg_match_all()ফাংশনের অনুরূপ প্যাটার্নের একাধিক ঘটনার সাথে মিল রেখে জাভাস্ক্রিপ্টের নিয়মিত এক্সপ্রেশন সমর্থনটি ব্যবহার করার কোনও উপায় আছে কি?

আমি উপ-ম্যাচের সাথে পৃথক পৃথকভাবে ফলাফল পাওয়ার কিছু উপায়ের লক্ষ্যে আছি:

[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]

অথবা

[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]

9
এটি কিছুটা অদ্ভুত যে কেউ replaceএখানে ব্যবহারের প্রস্তাব দেয় না । var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });সম্পন্ন. জাভাস্ক্রিপ্টের "ম্যাচএল" হ'ল স্ট্রিংয়ের পরিবর্তে প্রতিস্থাপন হ্যান্ডলার ফাংশনটির সাথে "প্রতিস্থাপন"।
মাইক 'পোম্যাক্স' কামারম্যানস

দ্রষ্টব্য যে 2020-এ এখনও এই প্রশ্নটি খুঁজে পাওয়া তাদের জন্য উত্তরটি " রিজেক্স ব্যবহার করবেন না, ইউআরএল সার্চপ্যারাম ব্যবহার করুন , যা আপনার পক্ষে এই সমস্ত কিছু করে।"
মাইক 'পোম্যাক্স' কামারম্যানস

উত্তর:


161

মন্তব্য থেকে উত্তোলন

2020 মন্তব্য: রেজেেক্স ব্যবহার করার পরিবর্তে, এখন আমাদের রয়েছে URLSearchParams, যা আমাদের জন্য এই সমস্ত কিছু করে, তাই কোনও কাস্টম কোড, একাকী রেজেক্সকে আর প্রয়োজন হয় না।

- মাইক 'পোম্যাক্স' কামারম্যানস

ব্রাউজার সমর্থনটি এখানে https://caniuse.com/#feat=urlsearchparams তালিকাভুক্ত


প্যারামিটারের নাম এবং মান পৃথকভাবে ক্যাপচার করতে উপ-গ্রুপগুলি ব্যবহার করে আমি একটি বিকল্প রেজেক্সের পরামর্শ দেব re.exec():

function getUrlParams(url) {
  var re = /(?:\?|&(?:amp;)?)([^=&#]+)(?:=?([^&#]*))/g,
      match, params = {},
      decode = function (s) {return decodeURIComponent(s.replace(/\+/g, " "));};

  if (typeof url == "undefined") url = document.location.href;

  while (match = re.exec(url)) {
    params[decode(match[1])] = decode(match[2]);
  }
  return params;
}

var result = getUrlParams("http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=Frankfurt+am+Main&sll=50.106047,8.679886&sspn=0.370369,0.833588&ie=UTF8&ll=50.116616,8.680573&spn=0.35972,0.833588&z=11&iwloc=addr");

result একটি বস্তু:

{
  f: "q"
  জিওকোড: ""
  এইচএল: "দে"
  অর্থাত: "ইউটিএফ 8"
  iwloc: "সংযোজক"
  ll: "50.116616,8.680573"
  প্রশ্ন: "ফ্র্যাঙ্কফুর্ট আমি প্রধান"
  sll: "50.106047,8.679886"
  উত্স: "এস_কিউ"
  spn: "0.35972,0.833588"
  এসএসপিএন: "0.370369,0.833588"
  z: "11"
}

রেজেক্স নীচে ভেঙে গেছে:

(?: # নন-ক্যাপচারিং গ্রুপ
  \? | & # "?" বা "&"
  (: এবং;?)? # (ভুলভাবে এইচটিএমএল-এনকোডযুক্ত ইউআরএলগুলির জন্য "& amp;" অনুমতি দিন)
) # সমাপ্ত নন-ক্যাপচারিং গ্রুপ
( # 1 নং দল
  [^ = & #] + # "=", "&" বা "#" ব্যতীত কোনও অক্ষর; অন্তত একবার
) # শেষ গ্রুপ 1 - এটি প্যারামিটারের নাম হবে
(?: # নন-ক্যাপচারিং গ্রুপ
  =? # an "=", alচ্ছিক
  (# গ্রুপ 2
    [^ & #] * # "&" বা "#" ব্যতীত কোনও চরিত্র; যেকোন সংখ্যক বার
  ) # শেষ গ্রুপ 2 - এটি প্যারামিটারের মান হবে
) # সমাপ্ত নন-ক্যাপচারিং গ্রুপ

23
এই আমি আশা ছিল। যা আমি জাভাস্ক্রিপ্ট ডকুমেন্টেশনে কখনও দেখিনি সেটিতে উল্লেখ করা হয়েছে যে এক্সিকিউটিভ () পদ্ধতিটি একাধিকবার ডাকা হলে পরবর্তী ফলাফল সেটটি প্রদান করতে থাকবে। মহান টিপ জন্য আবার ধন্যবাদ!
অ্যাডাম ফ্রাঙ্কো

1
এটি এর কারণে এটি ঘটে: নিয়মিত- এক্সপ্রেশনগুলি.নোফো / জাভাস্ক্রিপ্ট এইচটিএমএল (এর মাধ্যমে পড়ুন: "জাভাস্ক্রিপ্টের রেজিপ্সপ অবজেক্টটি কীভাবে ব্যবহার করবেন")
টমলাক

1
এই কোডটিতে একটি ত্রুটি রয়েছে: "যখন" এর পরে সেমিকোলনটি সরানো উচিত।
জান উইলেম বি

1
কারণ আমি সাধারণত কেবলমাত্র (যেমন ক্যাপচারিং) গোষ্ঠীগুলি ব্যবহার করি যদি আমি তাদের সামগ্রীতে আসলে আগ্রহী interested
তোমালাক

1
নিবন্ধন জাভাস্ক্রিপ্টে যে কোনও অভিব্যক্তি তার নিজস্ব ফলাফলও তৈরি করে (যেমন x = yনির্ধারণ yকরে xএবং উত্পাদনও করে y)। যখন আমরা এই জ্ঞানটি এতে প্রয়োগ করি if (match = re.exec(url)): এটি এ) কার্যনির্বাহী করে এবং বি) এর ফলাফলটি প্রদান re.exec(url)করে while। কোনও মিল না থাকলে এখন re.execফিরে আসে null, যা মিথ্যা মান। সুতরাং কার্যত লুপটি যতক্ষণ ম্যাচ থাকবে ততক্ষণ চলতে থাকবে।
টমলাক

67

বিশ্বব্যাপী অনুসন্ধানের জন্য আপনাকে 'ছ' স্যুইচ ব্যবহার করতে হবে

var result = mystring.match(/(&|&)?([^=]+)=([^&]+)/g)

33
এটি আসলে সমস্যার সমাধান করে না: "গ্লোবাল পতাকা, 'জি' ব্যবহার করে সমস্ত উপস্থিতি মেলে তবে কেবল পৃথক কী এবং মানগুলি না দিয়ে পুরোপুরি মেলে সাব-স্ট্রিংগুলি ফিরিয়ে দেয়" "
অ্যাডাম ফ্রাঙ্কো

40

2020 সম্পাদনা

ইউআরএল সার্চপ্যারামগুলি ব্যবহার করুন , কারণ এই কাজের জন্য আর কোনও ধরণের কাস্টম কোডের প্রয়োজন নেই। ব্রাউজারগুলি একক নির্মাতার সাথে এটি আপনার জন্য করতে পারে:

const str = "1111342=Adam%20Franco&348572=Bob%20Jones";
const data = new URLSearchParams(str);
for (pair of data) console.log(pair)

উৎপাদনের

Array [ "1111342", "Adam Franco" ]
Array [ "348572", "Bob Jones" ]

সুতরাং এর জন্য আর রেজেক্স ব্যবহার করার কোনও কারণ নেই।

আসল উত্তর

যদি আপনি চলমান execশৈলীর সাথে মেলে এমন "অন্ধ মেলানো" এর উপর নির্ভর করতে না চান তবে জাভাস্ক্রিপ্টটি ম্যাচ-ইন-সমস্ত কার্যকারিতা নিয়ে আসে তবে এটি replace"ক্যাপচারের সাথে কী করতে হবে" ব্যবহার করার সময় এটি ফাংশন কলেরই অংশ part গোষ্ঠী " হ্যান্ডলিং ফাংশন :

var data = {};

var getKeyValue = function(fullPattern, group1, group2, group3) {
  data[group2] = group3;
};

mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, getKeyValue);

সম্পন্ন.

প্রকৃতপক্ষে প্রতিস্থাপনের স্ট্রিংগুলি ফিরিয়ে আনার জন্য ক্যাপচার গ্রুপ হ্যান্ডলিং ফাংশনটি ব্যবহার না করে (হ্যান্ডলিং প্রতিস্থাপনের জন্য, প্রথম আরগটি সম্পূর্ণ প্যাটার্ন ম্যাচ, এবং পরবর্তী আরোগুলি পৃথক ক্যাপচার গ্রুপগুলি হয়) আমরা কেবল গ্রুপ 2 এবং 3 টি ক্যাপচার এবং সেই জুটিকে ক্যাশে নিই।

সুতরাং জটিল পার্সিং ফাংশনগুলি লেখার পরিবর্তে মনে রাখবেন যে জাভাস্ক্রিপ্টে "ম্যাচআল" ফাংশনটি কেবল একটি প্রতিস্থাপন হ্যান্ডলারের ফাংশনটির সাথে "প্রতিস্থাপন" করা হয় এবং অনেক প্যাটার্নের সাথে ম্যাচিং দক্ষতা থাকতে পারে।


আমি একটি স্ট্রিং আছে something "this one" and "that one"। আমি ডাবল উদ্ধৃত সমস্ত স্ট্রিং একটি তালিকায় রাখতে চাই - [[এটি, এটি একটি])। এখনও অবধি mystring.match(/"(.*?)"/)প্রথমটিকে সনাক্তকরণে দুর্দান্ত কাজ করে তবে আমি একক ক্যাপচারিং গ্রুপের জন্য কীভাবে আপনার সমাধানটি মানিয়ে নেব তা আমি জানি না।
নিউ এভারেস্ট

2
মতামতগুলি সমাধান করার চেষ্টা করার পরিবর্তে আপনার স্ট্যাকওভারফ্লোতে কোনও প্রশ্ন পোস্ট করা উচিত বলে মনে হচ্ছে।
মাইক 'পোম্যাক্স' কামারম্যানস

আমি একটি নতুন প্রশ্ন তৈরি করেছি: stackoverflow.com/questions/26174122/…
নিউ ইভারেস্ট

1
নিশ্চিত না কেন এই উত্তরটির এত কয়েকটি উত্সাহ রয়েছে তবে এটি প্রশ্নের সেরা উত্তর।
কলিন

হাই @ মাইক'পোম্যাক্স কামারম্যানস, সম্প্রদায় নির্দেশিকা-রেখাগুলি তাদের উন্নত করার জন্য এন্ট্রিগুলি সম্পাদনা করার জন্য বিশেষভাবে পরামর্শ দেয়, দেখুন: stackoverflow.com/help/behavier । আপনার উত্তরের মূলটি অত্যন্ত সহায়ক, তবে আমি খুঁজে পেয়েছি "মনে রাখবেন ম্যাচএল প্রতিস্থাপন করা হয়েছে" ভাষাটি পরিষ্কার ছিল না এবং কেন আপনার কোড (যা স্পষ্ট নয়) এর কাজ ব্যাখ্যা করে না। আমি ভেবেছিলাম আপনার ভাল প্রাপ্য খ্যাতি পাওয়া উচিত, তাই আমি আপনার উত্তরটিকে উন্নত পাঠ্যের সাথে সদৃশ করার পরিবর্তে সম্পাদনা করেছি। এই প্রশ্নের মূল প্রশ্নকারী হিসাবে, আপনি এখনও আমাকে চাইলে এই উত্তরটির (এবং সম্পাদনা) - গ্রহণযোগ্যতাটি ফিরিয়ে আনতে আমি খুশি।
অ্যাডাম ফ্রাঙ্কো

21

গোষ্ঠীগুলি ক্যাপচার করার জন্য, আমি preg_match_allপিএইচপি ব্যবহার করতে অভ্যস্ত এবং আমি এখানে এর কার্যকারিতাটি প্রতিলিপি করার চেষ্টা করেছি:

<script>

// Return all pattern matches with captured groups
RegExp.prototype.execAll = function(string) {
    var match = null;
    var matches = new Array();
    while (match = this.exec(string)) {
        var matchArray = [];
        for (i in match) {
            if (parseInt(i) == i) {
                matchArray.push(match[i]);
            }
        }
        matches.push(matchArray);
    }
    return matches;
}

// Example
var someTxt = 'abc123 def456 ghi890';
var results = /[a-z]+(\d+)/g.execAll(someTxt);

// Output
[["abc123", "123"],
 ["def456", "456"],
 ["ghi890", "890"]]

</script>

3
@teh_senaus আপনাকে বৈশ্বিক সংশোধক উল্লেখ করতে হবে /gঅন্যথায় চলমান exec()বর্তমান সূচি পরিবর্তন করবে না এবং চিরতরে লুপ হয়ে যাবে।
আরম কোচার্যান

যদি আমি এই কোডটি myRe.test (str) যাচাইকরণের জন্য কল করি এবং তারপরে এক্সেকএল সবই করার চেষ্টা করি তবে এটি দ্বিতীয় ম্যাচে বড় হয় এবং আমরা প্রথম ম্যাচটি হেরে যাই।
fdrv

@fdrv লুপটি শুরু করার আগে আপনাকে সর্বশেষ তালিকাটি শূন্যে পুনরায় সেট করতে হবে: this.lastIndex = 0;
সিএফ

15

gবৈশ্বিক ম্যাচের জন্য সংশোধক সেট করুন :

/…/g

11
এটি আসলে সমস্যার সমাধান করে না: "গ্লোবাল পতাকা, 'জি' ব্যবহার করে সমস্ত উপস্থিতি মেলে তবে কেবল পৃথক কী এবং মানগুলি না দিয়ে পুরোপুরি মেলে সাব-স্ট্রিংগুলি ফিরিয়ে দেয়" "
অ্যাডাম ফ্রাঙ্কো

11

সূত্র: https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / রেজিএক্সপ /
এক্সেক

একের পর এক ম্যাচ সন্ধান করা

যদি আপনার নিয়মিত প্রকাশটি "জি" পতাকা ব্যবহার করে, আপনি একই স্ট্রিংয়ের ধারাবাহিক মিলগুলি খুঁজে পেতে একাধিকবার এক্সিকিউট () পদ্ধতিটি ব্যবহার করতে পারেন। আপনি যখন এটি করেন, অনুসন্ধানটি নিয়মিত অভিব্যক্তির সর্বশেষ তালিকাভুক্ত সম্পত্তি (পরীক্ষা () লাস্ট ইনডেক্স সম্পত্তিকেও অগ্রসর করবে) দ্বারা নির্দিষ্ট স্ট্রিংয়ের স্ট্রিংয়ের সাথে শুরু হয়। উদাহরণস্বরূপ, ধরে নিন আপনার কাছে এই স্ক্রিপ্ট রয়েছে:

var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
  var msg = 'Found ' + myArray[0] + '. ';
  msg += 'Next match starts at ' + myRe.lastIndex;
  console.log(msg);
}

এই লিপিটি নিম্নলিখিত পাঠ্য প্রদর্শন করে:

Found abb. Next match starts at 3
Found ab. Next match starts at 912

দ্রষ্টব্য: নিয়মিত এক্সপ্রেশন আক্ষরিক (বা RegExp কনস্ট্রাক্টর) কিছু সময়ের মধ্যে রাখবেন না বা প্রতিটি পুনরাবৃত্তির সাথে লাস্ট ইন্ডেক্সের সম্পত্তি পুনরায় সেট করার কারণে কোনও মিল থাকলে এটি অসীম লুপ তৈরি করবে। এছাড়াও নিশ্চিত হন যে বিশ্ব পতাকাটি সেট করা আছে বা একটি লুপ এখানেও আসবে।


যদি আমি এই কোডটি myRe.test (str) যাচাই করার জন্য কল করি এবং তারপরে কিছু করার চেষ্টা করি তবে এটি দ্বিতীয় ম্যাচে অংশ নেয় এবং আমরা প্রথম ম্যাচটি হেরে যাই।
fdrv

এছাড়াও আপনি একত্রিত করতে পারেন String.prototype.matchসঙ্গে g: পতাকা 'abbcdefabh'.match(/ab*/g)আয়['abb', 'ab']
thom_nic

2

যদি কারও (আমার মতো) অ্যারে সাপোর্ট (যেমন একাধিক নির্বাচন) এর সাথে তোমালকের পদ্ধতি প্রয়োজন, তবে তা এখানে:

function getUrlParams(url) {
  var re = /(?:\?|&(?:amp;)?)([^=&#]+)(?:=?([^&#]*))/g,
      match, params = {},
      decode = function (s) {return decodeURIComponent(s.replace(/\+/g, " "));};

  if (typeof url == "undefined") url = document.location.href;

  while (match = re.exec(url)) {
    if( params[decode(match[1])] ) {
        if( typeof params[decode(match[1])] != 'object' ) {
            params[decode(match[1])] = new Array( params[decode(match[1])], decode(match[2]) );
        } else {
            params[decode(match[1])].push(decode(match[2]));
        }
    }
    else
        params[decode(match[1])] = decode(match[2]);
  }
  return params;
}
var urlParams = getUrlParams(location.search);

ইনপুট ?my=1&my=2&my=things

ফলাফল 1,2,things(পূর্বে কেবল ফিরে এসেছে: জিনিসগুলি)


1

শিরোনাম দ্বারা নির্দেশিত হিসাবে প্রস্তাবিত প্রশ্নটি কেবল আটকে রাখতে, আপনি প্রতিটি স্ট্রিং ব্যবহার করে স্ট্রিংয়ে প্রকৃতপক্ষে পুনরাবৃত্তি করতে পারেন String.prototype.replace()। উদাহরণস্বরূপ, নিয়মিত প্রকাশের উপর ভিত্তি করে সমস্ত শব্দের একটি অ্যারে পেতে নিম্নলিখিতটি কেবল তা করে:

function getWords(str) {
  var arr = [];
  str.replace(/\w+/g, function(m) {
    arr.push(m);
  });
  return arr;
}

var words = getWords("Where in the world is Carmen Sandiego?");
// > ["Where", "in", "the", "world", "is", "Carmen", "Sandiego"]

আমি যদি ক্যাপচার গ্রুপগুলি বা প্রতিটি ম্যাচের সূচক পেতে চাইতাম তবে আমি এটিও করতে পারি। নিম্নলিখিতটি দেখায় যে কীভাবে প্রতিটি ম্যাচ পুরো ম্যাচ, প্রথম ক্যাপচার গ্রুপ এবং সূচীর সাথে ফিরে আসে:

function getWords(str) {
  var arr = [];
  str.replace(/\w+(?=(.*))/g, function(m, remaining, index) {
    arr.push({ match: m, remainder: remaining, index: index });
  });
  return arr;
}

var words = getWords("Where in the world is Carmen Sandiego?");

উপরের রান করার পরে, wordsনিম্নলিখিত হিসাবে হবে:

[
  {
    "match": "Where",
    "remainder": " in the world is Carmen Sandiego?",
    "index": 0
  },
  {
    "match": "in",
    "remainder": " the world is Carmen Sandiego?",
    "index": 6
  },
  {
    "match": "the",
    "remainder": " world is Carmen Sandiego?",
    "index": 9
  },
  {
    "match": "world",
    "remainder": " is Carmen Sandiego?",
    "index": 13
  },
  {
    "match": "is",
    "remainder": " Carmen Sandiego?",
    "index": 19
  },
  {
    "match": "Carmen",
    "remainder": " Sandiego?",
    "index": 22
  },
  {
    "match": "Sandiego",
    "remainder": "?",
    "index": 29
  }
]

পিএইচপি-তে যা পাওয়া যায় তার অনুরূপ একাধিক ঘটনার সাথে মিল রাখতে preg_match_allআপনি এই জাতীয় চিন্তাভাবনাটি নিজের তৈরি করতে বা এই জাতীয় কিছু ব্যবহার করতে পারেন YourJS.matchAll()। আপনার জেএস আরও বা কম এই ফাংশনটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করে:

function matchAll(str, rgx) {
  var arr, extras, matches = [];
  str.replace(rgx.global ? rgx : new RegExp(rgx.source, (rgx + '').replace(/[\s\S]+\//g , 'g')), function() {
    matches.push(arr = [].slice.call(arguments));
    extras = arr.splice(-2);
    arr.index = extras[0];
    arr.input = extras[1];
  });
  return matches[0] ? matches : null;
}

যেহেতু আপনি কোনও ইউআরএল এর ক্যোরিয় স্ট্রিংটি পার্স করতে চান তাই আপনি YourJS.parseQS()( yourjs.com/snippets/56 ) জাতীয় কিছু ব্যবহার করতে পারেন , যদিও অন্যান্য অনেক লাইব্রেরিও এই কার্যকারিতাটি সরবরাহ করে।
ক্রিস ওয়েস্ট

একটি লুপে একটি বহিরাগত স্কোপ থেকে ভেরিয়েবল পরিবর্তন করা যা প্রতিস্থাপনটি ফেরত দেবে বলে মনে করা একধরণের খারাপ bad আপনার অপব্যবহারটি এখানে প্রতিস্থাপন করুন
হুয়ান মেন্ডেস

1

আপনি যদি এটি ব্যবহার করে পালাতে পারেন তবে mapএটি একটি চার-লাইন-সমাধান:

var mystring = '1111342=Adam%20Franco&348572=Bob%20Jones';

var result = mystring.match(/(&|&amp;)?([^=]+)=([^&]+)/g) || [];
result = result.map(function(i) {
  return i.match(/(&|&amp;)?([^=]+)=([^&]+)/);
});

console.log(result);

সুন্দর নয়, দক্ষ নয়, তবে কমপক্ষে এটি কমপ্যাক্ট। ;)


1

ব্যবহার window.URL:

> s = 'http://www.example.com/index.html?1111342=Adam%20Franco&348572=Bob%20Jones'
> u = new URL(s)
> Array.from(u.searchParams.entries())
[["1111342", "Adam Franco"], ["348572", "Bob Jones"]]

1

2020 সালের হ্যালো। আমাকে আপনার দৃষ্টি আকর্ষণ করার জন্য স্ট্রিং.প্রোটোটাইপ.ম্যাচএল () আনুন:

let regexp = /(?:&|&amp;)?([^=]+)=([^&]+)/g;
let str = '1111342=Adam%20Franco&348572=Bob%20Jones';

for (let match of str.matchAll(regexp)) {
    let [full, key, value] = match;
    console.log(key + ' => ' + value);
}

আউটপুট:

1111342 => Adam%20Franco
348572 => Bob%20Jones

অবশেষে! সতর্কতার একটি নোট: "বিশ্বব্যাপী নিয়মিত প্রকাশের ফলে উত্পাদিত সমস্ত ম্যাচ অবজেক্টের জন্য একটি ইেটরেটর তৈরি করতে স্ট্রিংসের জন্য ম্যাচআল পদ্ধতিটি" ইসমাস্ক্রিপ্ট ২০২০ "প্রবর্তন করে" । উত্তরে লিঙ্কযুক্ত সাইট অনুসারে, বেশিরভাগ ব্রাউজার এবং নোডজেএস বর্তমানে এটি সমর্থন করে তবে আইই, সাফারি বা স্যামসুং ইন্টারনেট নয়। আশা করি শীঘ্রই সমর্থনটি প্রশস্ত হবে তবে কিছুক্ষণের জন্য ওয়াইএমএমভি।
অ্যাডাম ফ্রাঙ্কো

0

একই নামটি ব্যবহার করে বেশ কয়েকটি পরামিতি ক্যাপচার করতে, আমি তোমালকের পদ্ধতিতে এভাবে লুপটি সংশোধন করেছি:

  while (match = re.exec(url)) {
    var pName = decode(match[1]);
    var pValue = decode(match[2]);
    params[pName] ? params[pName].push(pValue) : params[pName] = [pValue];
  }

ইনপুট: ?firstname=george&lastname=bush&firstname=bill&lastname=clinton

আয়: {firstname : ["george", "bill"], lastname : ["bush", "clinton"]}


আমি আপনার ধারণাটি পছন্দ করার সময় এটি একক প্যারামের সাথে খুব ভাল কাজ করে না, যেমনটি ?cinema=1234&film=12&film=34আমি আশা করি {cinema: 1234, film: [12, 34]}। এটি প্রতিফলিত করতে আপনার উত্তর সম্পাদনা করেছেন।
TWiStErRob

0

ঠিক আছে ... আমারও একই সমস্যা ছিল ... আমি RegExp এর সাথে একটি ইনক্রিমেন্টাল / স্টেপ অনুসন্ধান চাই (যেমন: অনুসন্ধান শুরু করুন ... কিছু প্রক্রিয়াজাতকরণ করুন ... শেষ ম্যাচ পর্যন্ত অনুসন্ধান চালিয়ে যান)

প্রচুর ইন্টারনেট অনুসন্ধানের পরে ... সর্বদা মত (এটি এখন একটি অভ্যাসে পরিণত হচ্ছে) আমি স্ট্যাকওভারফ্লোতে এসে উত্তরটি পেয়েছি ...

কী উল্লেখ করা হয়নি এবং উল্লেখ করার বিষয়গুলি হল " lastIndex" আমি এখন বুঝতে পেরেছি কেন রেজিএক্সপ্যাক্স বস্তু " lastIndex" সম্পত্তি প্রয়োগ করে


0

এটি বিভক্ত করা আমার কাছে সেরা বিকল্পের মতো দেখাচ্ছে:

'1111342=Adam%20Franco&348572=Bob%20Jones'.split('&').map(x => x.match(/(?:&|&amp;)?([^=]+)=([^&]+)/))

0

রেজেক্স হেল্প এড়াতে আপনি আপনার প্রথম ম্যাচটি খুঁজে পেতে পারেন, একটি অংশ কেটে ফেলুন এবং তারপরে পরবর্তীটি খুঁজে পাওয়ার চেষ্টা করুন। সি # তে এটির মতো কিছু দেখাচ্ছে, দুঃখিত আমি আপনার জন্য এটি জাভাস্ক্রিপ্টে পোর্ট করেছি।

        long count = 0;
        var remainder = data;
        Match match = null;
        do
        {
            match = _rgx.Match(remainder);
            if (match.Success)
            {
                count++;
                remainder = remainder.Substring(match.Index + 1, remainder.Length - (match.Index+1));
            }
        } while (match.Success);
        return count;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.