您不会在 JavaScript 正则表达式中进行回溯。你确实得到了前瞻,但它在 IE 中是不可靠的,所以最好避免,除非你真的知道你在做什么。
[^&(?!amp;)]+&
是的,这真的没有任何意义。您不能在[]
字符组中使用前瞻:您在此处所说的是匹配不是&
, (
, ?
, !
, a
, m
, p
, ;
, 或的字符)
。
但是无论如何你都不应该看到&
:你应该处理一个普通的、未编码的查询字符串,例如。从location.search
. (如果你用正则表达式破解字符串中的 HTML 标记,你会遇到很多更大的问题。)
如果您从获取查询字符串,如果有任何查询location.search
,您将?
在前面有一个。&
因此,您可以使用or匹配开头?
,并在以下位置进行正则表达式匹配:
location.search.replace(
/([?&;]category=)[^&;]+/,
'$1'+encodeURIComponent(sNewValue)
);
请注意,我还;
根据 HTML4 第 B.2.2 节将其作为可能的分隔符包含在内,并用于encodeURIComponent
使无效字符(如空格和特殊字符(如其&
本身)得到正确的 URL 编码)。还有字符$
,否则在正则表达式替换字符串中具有特殊含义。
这仍然很混乱,并且无法处理 URL 编码的参数名称(即c%61tegory
是一种有效的替代方式category
)或具有相同名称的多个参数。如果您想对其更加健壮,您可以转储正则表达式并进行完整的查询字符串解析/重构。请参阅此答案中的功能并执行以下操作:
var lookup= queryToLookup(location.search);
lookup['category']= ['New value'];
var query= lookupToQuery(lookup);