0

JS を使用して、現在のページのクエリ文字列の値を置き換えようとしています。例: からcategory=Old Valueまでcategory=New Value。コードは次のようになります。

var sNewValue = 'New Value';
sQueryString = sQueryString.replace(/category=[^&]+&?/, 'category=' + sNewValue);

アンパサンドを含む値を除いて、正常に機能します。幸いなことに、すべてのアンパサンドは URL エンコードされているため、アンプを破棄する必要があることはわかっています。&の前。先読みを使用する必要があると思いますが、方法がわかりません。この正規表現を試しましたが、うまくいきませんでした:/category=[^&(?!amp;)]+&?/

ありがとう

4

6 に答える 6

1

以下を指定する必要はまったくありません&

var sNewValue = 'New Value';
sQueryString = sQueryString.replace(/(^|&)category=[^&]*/, '$1category=' + encodeURIComponent(sNewValue));

[^&]は、 以外の任意の文字に既に一致するため&です。さらに、categoryが最後のパラメータである場合、次の さえありません&

于 2010-09-21T14:37:52.487 に答える
1

アンパサンドが & としてエンコードされるのはなぜですか? %26 の代わりに? または、あなたの質問を間違って読んでいますか?

それが必要な場合は、最初に名前と値のペアに分割すると、このクエリ文字列を処理しやすくなる可能性があります。

var pairStrings = sQueryString.split(/&(?!amp;)/gi);

その後、エンコードされた & が含まれているかどうかを気にせずに、各値を操作できます。

于 2010-09-21T14:46:52.880 に答える
0

OK、私はあなたが必要なものを実際に見つけたと思います。

var sNewValue = 'category=New Value&';
sQueryString = sQueryString.replace(/category=([^&]|&)*&/, sNewValue)
于 2010-09-21T14:33:40.203 に答える
0

あなたが試すことができます:

var sNewValue = 'New Value';
sQueryString = sQueryString.replace(/\bcategory=[^&]*/, 'category=' + sNewValue);

これは、次のようにカテゴリの前にある場合でも置き換えられ?ます/foo.php?category=bar

于 2010-09-21T15:18:58.053 に答える
0

JavaScript の正規表現では後読みできません。先読みはできますが、IE では信頼性が低いため、自分が何をしているのか本当によくわかっていない限り、避けるのが最善です。

[^&(?!amp;)]+&

ええ、これは本当に意味がありません。文字グループで先読みを使用することはできません。ここで[]言っているのは、、、、、、、、、、またはで&はない一致文字です。(?!amp;)

ただし、とにかく見る必要はありません&。プレーンでエンコードされていないクエリ文字列で作業する必要があります。から取得したとおりlocation.search。(正規表現を使用して文字列内の HTML マークアップをハッキングしている場合、はるかに大きな問題が発生します。)

からクエリ文字列を取得している場合、クエリがlocation.searchある場合は先頭に があります?。したがって、先頭を または のいずれ&?と一致させ、正規表現の一致を次のように行うことができます。

location.search.replace(
    /([?&;]category=)[^&;]+/,
    '$1'+encodeURIComponent(sNewValue)
);

また;、HTML4 セクション B.2.2 に従って可能なセパレーターとして含め、encodeURIComponentスペースなどの無効な文字や&それ自体などの特殊文字が適切に URL エンコードされるように使用しました。また、$そうでなければ正規表現置換文字列で特別な意味を持つ文字 。

c%61tegoryこれはまだ非常に厄介で、URL エンコードされたパラメーター名 (つまり、有効な別の言い方ですcategory) や、同じ名前の複数のパラメーターには対応していません。より堅牢にしたい場合は、正規表現をダンプして、完全なクエリ文字列の解析/再構築を行うことができます。この回答の関数を見て、次のことを行います。

var lookup= queryToLookup(location.search);
lookup['category']= ['New value'];
var query= lookupToQuery(lookup);
于 2010-09-21T15:22:54.127 に答える
0

/(\bcategory=)(([^&]|&amp\;)*)/

これには、さまざまなシナリオが含まれます。

   var s1 = 'http://www.foobar.com/?category=old&foo=bar';
   var s2 = 'http://www.foobar.com/?category=old';
   var s3 = 'http://www.foobar.com/?foo=bar&category=old';
   var s4 = 'http://www.foobar.com/?foo=bar&category=old&value';
   var s5 = 'http://www.foobar.com/?foo=bar&category=old&value&bar=foo';

   var n  = 'NewVal';

   console.log( s1.replace(/(\bcategory=)(([^&]|&amp\;)*)/, "$1" + n) );
   console.log( s2.replace(/(\bcategory=)(([^&]|&amp\;)*)/, "$1" + n) );
   console.log( s3.replace(/(\bcategory=)(([^&]|&amp\;)*)/, "$1" + n) );
   console.log( s4.replace(/(\bcategory=)(([^&]|&amp\;)*)/, "$1" + n) );
   console.log( s5.replace(/(\bcategory=)(([^&]|&amp\;)*)/, "$1" + n) );

   // s1 output: http://www.foobar.com/?category=NewVal&foo=bar
   // s2 output: http://www.foobar.com/?category=NewVal
   // s3 output: http://www.foobar.com/?foo=bar&category=NewVal
   // s4 output: http://www.foobar.com/?foo=bar&category=NewVal
   // s5 output: http://www.foobar.com/?foo=bar&category=NewVal&bar=foo

グローバル スイッチを追加することができます。

于 2010-09-21T15:23:42.220 に答える