0

次のような GET 引数を持つ URL を指定すると、

http://www.domain.com?key1=value1+value2+value3&key2=value4+value5

特定のキーのすべての値を (可能であれば別の参照に) キャプチャしたいと考えています。たとえば、目的のキーが\1 (または言語によっては $1)、\2、および\3 でkey1キャプチャする必要がある場合。value1value2value3

私の欠陥のある正規表現は次のとおりです。

/[?&](?:key1)=((?:[^+&]+[+&$])+)/

0の結果が得られます。

私は ECMA 構文を使用して c++ でこれを書いていますが、解決策やアドバイスを任意の正規表現から ECMA に変換できると思います。どんな助けでも大歓迎です。

4

1 に答える 1

2

これは以前に回答されており、そのために書かれたコンパクトなスクリプトがあります。

正規表現は、クエリ文字列値の抽出には最適ではありません。この回答の最後に、特定のフィールドの値を個別の参照に抽出できる式を示します。ただし、正規表現を使用して一度に 1 つずつパラメーターを抽出するのに「多くの」時間がかかるわけではありませんが、正規表現エンジンを必要とせずに、パラメーターをすべて非常に迅速に完全に抽出できます。たとえば、http://www.htmlgoodies.com/beyond/javascript/article.php/3755006/How-to-Use-a-JavaScript-Query-String-Parser.htm

これらのパラメーターを抽出するために使用しようとしている言語は C++ ですか?

JavaScript を使用している場合は、上記の記事で説明した小さな関数を使用します。つまり、

function ptq(q)
{
/* parse the query */
var x = q.replace(/;/g, '&').split('&'), i, name, t;
/* q changes from string version of query to object */
for (q={}, i=0; i<x.length; i++)
{
t = x[i].split('=', 2);
name = unescape(t[0]);
if (!q[name])
q[name] = [];
if (t.length > 1)
{
q[name][q[name].length] = unescape(t[1]);
}
/* next two lines are nonstandard, allowing programmer-friendly Boolean parameters */
else
q[name][q[name].length] = true;
}
return q;
}
function param() {
return ptq(location.search.substring(1).replace(/+/g, ' '));
}

そのコードをページのスクリプトに含めたら、 などquery = param();の値を実行してから使用することで、現在の URL データを解析できます。query.key1

ptq()関数を直接使用して、他のクエリ文字列形式のデータを解析できますquery_object = ptq(query_string)

別の言語を使用していて、正規表現を使用したい場合は、次のように、一致するすべての値が返さkey1れます。

/key1=([^&;]*)/g

これにより、特定のフィールド名を持つすべての値が返されます (クエリ文字列の定義では、このように記述されますkey1=value1&key1=value2&key1=value3)。

あなたの質問の仕方は、値をスペースで区切って、値を提供する独自のプログラマフレンドリーな方法 (つまり、ブラウザーを介してフォーム送信からデータを受け取るのではなく、独自のカスタム URL を構築すること) を作成したいように思えます。 (スペースは、HTTP GET クエリ文字列では + 記号としてエンコードされ、一般的なクエリ文字列では %20 としてエンコードされます)。

複雑な正規表現を作成してこれを 1 ステップで実行することもできますが、フィールド全体 (すべての値と + 記号も) に一致させてから、結果を + 記号で分割する方が高速です。

私が示した正規表現からの各結果について、単純に実行するだけでプラス記号で区切られた値を抽出できます/[^+]*/g

于 2013-06-06T23:50:05.030 に答える