1. ホーム
  2. javascript

[解決済み] PHP の preg_match_all() のように、JavaScript の正規表現で複数回マッチさせるにはどうしたらよいですか?

2022-04-25 16:31:18

質問

キー=バリューのペアを次のいずれかで区切ったurlエンコード文字列を解析しようとしています。 & または & .

以下は、キーと値を別々の結果要素に分解し、最初の出現にのみマッチします。

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

文字列 '1111342=Adam%20Franco&348572=Bob%20Jones' の結果は、次のようになります。

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

グローバルフラグ 'g' を使用すると、すべてのオカレンスにマッチしますが、 完全にマッチした部分文字列のみを返し、キーと値を分離したものは返しません。

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

文字列 '1111342=Adam%20Franco&348572=Bob%20Jones' の結果は、次のようになります。

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

で文字列を分割することができましたが & というパターンが複数回出現した場合に、JavaScript の正規表現サポートを使ってマッチングさせる方法はないでしょうか? /(?:&|&)?([^=]+)=([^&]+)/ PHP の preg_match_all() という関数があるのですか?

サブマッチを分離して結果を得る方法を探しています。

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

または

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

解決方法は?

コメントより抜粋

<ブロッククオート

2020年のコメント:regexを使うのではなく、今は 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"
  geocode: ""
  hl: "de"
  ie: "UTF8"
  iwloc: "addr"
  ll: "50.116616,8.680573"
  q: "フランクフルト・アム・マイン"
  sll: "50.106047,8.679886"
  source: "s_q"。
  spn: "0.35972,0.833588"
  sspn: "0.370369,0.833588"
  z: "11"
}

正規表現は以下のように分解される。

(?:            # 非捕獲グループ
  \♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
  (?:amp;)?    # ("&amp;" を許可、間違ってHTMLエンコードされたURLのため)
)              # end non-capturing group
( # グループ1
  [^=&#]+ # "=", "&", "#" 以外の任意の文字を1回以上使用する。
)              # end group 1 - これがパラメータの名前になります。
(?:            # 非捕獲グループ
  =?           # an "=", オプション
  ( # グループ2
    [^&#]* # "&" または "#" 以外の任意の文字(任意の回数
  )            # end group 2 - これがパラメータの値になります。
)              # キャプチャしないグループの終了