我正在尝试更换名字,姓氏,电子邮件,电话,地址字段,而不是其他字段。
这就是我目前使用正则表达式做的事情 (安培;?(名字| lastName的|电子邮件| PHONE1 |地址)= [^&安培;] *)
这基本上选择“&”其次是firstName | lastName | email | phone1 |地址以及“=”之后的每个字符。请注意,如果“=”后跟“&”,则正则表达式不匹配符号
我可以正确选择每个字段但是当网址有“&”时在“=”之后我的解决方案无法正常工作,因为它只选择“&”之前的值字符。
因为有效的电子邮件可以有“&”。我需要一个解决方案,正则表达式选择即使有“&” “=”之后的符号。
示例:& email = abc& xyz @ .com - 在这种情况下,正则表达式只选择“& email = abc&”而不是整个电子邮件。
答案 0 :(得分:1)
根据url编码的规范,可能无法明确地完成此任务。为了实现这一点,数据集中的网址必须标准化,以便每个参数后面都有一个等号,并且参数值中必须没有其他的杂散等号。如果这两个条件都成立,那么以下内容将起作用:
&(firstName|lastName|email|phone1|address)=([^&]*(?:&[^&=]+(?=&|$))*)
另请注意,此正则表达式不包括其中一个所需参数是第一个参数的情况。因为Javascript正则表达式是有限的,这是一个特殊情况(从?
而不是&
开始),这将需要以不同的方式处理,具体取决于您要对参数执行的操作。匹配以下内容并替换为?
是一种删除参数的方法:
\?(firstName|lastName|email|phone1|address)=([^&]*(?:&[^&=]+(?=&|$))*)(?:&|$)
如果您不打算完全删除参数,可以删除表达式末尾的(?:&|$)
以简化操作。
根据您更换参数的计划,您可能会发现调整表达式很有用,但这些通常应该在上述规则中提供所需的输出。
这里的技巧是让一个单独的非捕获组(?:&[^&=]+(?=&|$))*
处理参数字符串的其他部分,其中包含原始符号,但没有等号。字符类[^&=]+
确保子表达式没有符号或等号,并且前瞻(?=&|$)
确保字符串后跟另一个参数或字符串的结尾,而不是等号。整个组都有一个量词*
,因为它可以在初始参数后出现零次,一次或多次。
另外请注意,为方便起见,参数名称和值的值存储在capturing groups 1和2中,以便于访问和解析。如果您不打算使用这些值,可以在?:
之后添加(
,将其替换为非捕获组。
如果任何参数缺少等号,则无法从前一个url参数的值明确消除新url参数的歧义,因为在示例https://example.com?&iframeLoad=true&email=abc&xyz@.com
中,这可能是指一个名为{{的参数1}}使用值email
,或者两个名为abc&xyz@.com
和email
的参数(除非参数字符串列表和值字符串列表都标准化,但在这条道路上是疯狂的)。以类似的方式,随机等号欺骗解析器。正如@David Faber所提到的,通常URL中的xyz@.com
字符将被编码为&
,以防止这种歧义。
答案 1 :(得分:0)
你可能想要考虑这样的事情:
[&?]((?:firstName|lastName|phone1|address|zipcode)=|email=(?:.*@.*\.)?)[^&]*
此处email
参数作为特殊情况处理 - 我们检查本地部分后跟子域名,同时允许没有符号的TLD(我相信这是安全的 - 我不会&#39 ; tT认为TLD可以包含奇怪的字符。所有其他参数都正常处理。匹配将作为名称=值对返回。 See Regex 101 here