Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式以匹配url中的特定请求参数_Javascript_Regex_Regex Negation_Regex Group - Fatal编程技术网

Javascript 正则表达式以匹配url中的特定请求参数

Javascript 正则表达式以匹配url中的特定请求参数,javascript,regex,regex-negation,regex-group,Javascript,Regex,Regex Negation,Regex Group,我有一个网址 () 我正在尝试替换firstname、lastname、email、phone、address字段,而不是其他字段 这就是我目前使用正则表达式所做的 (&?(firstName | lastName | email | phone1 | address)=?[^&]*) 这基本上会选择“&”,后跟firstName | lastName | email | phone1 | address以及“=”后面的每个字符。请注意,如果“=”后跟“&”符号,则正则表达式不匹配 我能够正确选

我有一个网址 ()

我正在尝试替换firstname、lastname、email、phone、address字段,而不是其他字段

这就是我目前使用正则表达式所做的 (&?(firstName | lastName | email | phone1 | address)=?[^&]*)

这基本上会选择“&”,后跟firstName | lastName | email | phone1 | address以及“=”后面的每个字符。请注意,如果“=”后跟“&”符号,则正则表达式不匹配

我能够正确选择每个字段,但当URL在“=”之后有一个“&”时,我的解决方案无法正常工作,因为它只选择“&”字符之前的值

因为一封有效的电子邮件可以有一个“&”。我需要一个解决方案,其中正则表达式即使在“=”后面有“&”符号也会进行选择


示例:&email=abc&xyz@.com-在这种情况下,正则表达式只选择“&email=abc&”,而不是选择整个电子邮件。

根据url编码的规范,此任务可能无法明确完成。为了实现这一点,必须对数据集中的URL进行标准化,以便每个参数后面都有一个等号,并且参数值中不得有其他多余的等号。如果这两个条件均为真,则以下条件将起作用:

正则表达式

还请注意,此正则表达式不包括所需参数之一是第一个参数的情况。由于Javascript正则表达式是有限的,而且这是一种特殊情况(从
开始,而不是
&
),因此需要根据您希望对参数执行的操作进行不同的处理。匹配以下内容并替换为
是删除参数的一种方法:

如果您不打算完全删除该参数,可以删除表达式末尾的
(?:&|$)
,以简化操作

根据您计划用什么替换参数,您可能会发现调整表达式很有用,但这些表达式通常会在上述规则中给出所需的输出

工作原理 这里的诀窍是有一个单独的非捕获组
(?:&[^&=]+(?=&|$)*
,它处理参数字符串的其他部分,这些部分带有原始的符号,但没有等号。字符类
[^&=]+
确保子表达式没有符号或等号,而前瞻
(?=&&$)
确保字符串后面跟着另一个参数或字符串的结尾,而不是等号。整个组都有一个量词
*
,因为它可以在初始参数之后出现零次、一次或多次

另请注意,为了方便起见,参数名称和值的值存储在1和2中,以便于访问和解析。如果您不打算使用这些值,可以通过在
)之后添加
?:
将它们替换为非捕获组

免责声明
如果任何参数缺少等号,则无法明确地将新url参数与前一个url参数的值区分开来,因为在示例中
https://example.com?&iframeLoad=true&email=abc&xyz@.com
,这可能是指一个名为
email
的参数,其值为
abc&xyz@.com
,或两个名为
电子邮件
xyz@.com
(除非参数字符串列表和值字符串列表都是标准化的,但这条路的尽头是疯狂)以类似的方式,随机的相等符号欺骗解析器。正如David Faber所提到的,URL中典型的<代码>和/代码>字符将被URL编码为<代码> % 26 <代码>,以完全防止这种歧义。

您可能想考虑这样的事情:

[&?]((?:firstName|lastName|phone1|address|zipcode)=|email=(?:.*@.*\.)?)[^&]*

email
参数在这里作为特例处理-我们检查本地部分后接子域,同时允许TLD不带符号(我相信这是安全的-我认为TLD不能包含这样的奇怪字符)。所有其他参数均正常处理。匹配项将以名称=值对的形式返回。

考虑使用url语法通常url中的
&
字符将采用url编码:
%26
。您在中使用的正则表达式是什么编程语言/程序?因为正则表达式是特定于平台的,并且某些正则表达式引擎支持更多函数与其他人相比,这与问题非常相关。在使用javascript匹配字符串后,我将替换字符串。@Graham感谢您的帮助!@DavidFaber和DanielThanks!这正是我想要实现的。感谢您的详细解释:)@GrahamI不推荐这种方法。首先。即使您想使用这种方法,也应该避免使用
*
构造,这既有效率,也有效率。这个解决方案也不足以满足OP替换url中文本的要求:对于替换,知道第一个字符是至关重要的,但无法从这个表达式中知道。我这里绝对不建议任何电子邮件验证。我同意最好避免使用
*
。一般来说,我认为任何类型的电子邮件验证都是一种不好的方法,因为它假设输入是合法的电子邮件,而我们不一定假设这一点。但是,如果您使用(基本)电子邮件验证方法,并且允许替换,那么您真正想要的正则表达式是。此外,我在解决方案中使用了两个单独的正则表达式,因为第一个参数的删除处理将不同。@Graham,谢谢,这比我最初的正则表达式要好