[解決済み] PHP の preg_match_all() のように、JavaScript の正規表現で複数回マッチさせるにはどうしたらよいですか?
質問
キー=バリューのペアを次のいずれかで区切った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;)? # ("&" を許可、間違ってHTMLエンコードされたURLのため) ) # end non-capturing group ( # グループ1 [^=&#]+ # "=", "&", "#" 以外の任意の文字を1回以上使用する。 ) # end group 1 - これがパラメータの名前になります。 (?: # 非捕獲グループ =? # an "=", オプション ( # グループ2 [^&#]* # "&" または "#" 以外の任意の文字(任意の回数 ) # end group 2 - これがパラメータの値になります。 ) # キャプチャしないグループの終了
関連
-
vueが定義するプライベートフィルタと基本的な使い方
-
Vueのクラススタイルの使い方の詳細
-
JavaScriptのStringに関する共通メソッド
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
jsを使った簡単な照明スイッチのコード
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ
-
JavaScriptのgetElementById()メソッド入門