代码之家  ›  专栏  ›  技术社区  ›  bogdan

Javascript RegExp替换为负前瞻

  •  0
  • bogdan  · 技术社区  · 16 年前

    我试图用JS替换当前页面的查询字符串中的一些值。例如:从 category=Old Value category=New Value . 编写代码的步骤如下所示:

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

    它可以正常工作,除了有符号的值。幸运的是所有的符号都是URL编码的,所以我知道我应该放弃 amp; & . 我想我应该用长相头,但我不知道怎么用。我尝试了这个正则表达式,但没有成功: /category=[^&(?!amp;)]+&?/

    谢谢

    6 回复  |  直到 16 年前
        1
  •  1
  •   adam0101    16 年前

    为什么将与号编码为&而不是%26?还是我看错你的问题了?

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

    然后您就可以处理每个值,而不用担心它是否包含编码的值。

        2
  •  1
  •   Gumbo    16 年前

    您不需要指定以下内容 &

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

    因为 [^&] 已匹配除 & 类别 &

        3
  •  0
  •   ChaosPandion    16 年前

    好吧,我想我真的找到你需要的了。

    var sNewValue = 'category=New Value&';
    sQueryString = sQueryString.replace(/category=([^&]|&)*&/, sNewValue)
    
        4
  •  0
  •   Toto    16 年前

    您可以尝试:

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

    即使类别前面有 ? 如在 /foo.php?category=bar

        5
  •  0
  •   vol7ron    16 年前

    /(\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
    

    您可能需要添加一个全局开关。

        6
  •  0
  •   Community Mohan Dere    9 年前

    向前看,但这在IE中是不可靠的,所以最好避免,除非你真的知道你在做什么。

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

    [] 角色组:你在这里说的是匹配不匹配的角色 & , ( , ? ! , a , m p , ; ,或 ) .

    & 无论如何:您应该处理一个普通的、未编码的查询字符串,例如从 location.search

    如果你 从中获取查询字符串 位置.搜索 & ?

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

    注:我还包括 ; 作为HTML4第B.2.2节中可能的分隔符,并使用 encodeURIComponent 使无效字符如空格和特殊字符如 & 它本身得到正确的URL编码。还有这个角色 $ ,否则在regexp替换字符串中具有特殊含义。

    c%61tegory category )或具有相同名称的多个参数。如果您想更加健壮,可以转储regexp并执行完整的查询字符串解析/重构。查看中的函数 this answer 然后做:

    var lookup= queryToLookup(location.search);
    lookup['category']= ['New value'];
    var query= lookupToQuery(lookup);