0

我目前正在使用可以插入网页的存根服务器,因此每次测试付款屏幕时都不需要点击 sagepay。我需要服务器接收来自网页的请求,并使用 URL 中包含的动态参数来构建服务器响应。存根使用正则表达式目标来挑选我需要的参数并将它们添加到响应中。

我正在使用这个存根服务器

我使用此处包含的正则表达式测试器逐个构建接受的 URL来测试每一位逻辑。这些表达式单独工作,但是当我尝试将其中的两个或多个组合在一起时,它们拒绝工作。每个参数都由一个与号 (&) 和参数名称分隔。

以下是参数示例:

paymentType=A&amount=147.06&policyUid=07ef493b-0000-0000-6a05-9fa4d6a5b5ad&paymentMethod=A&script=Retail/accept.py&scriptParams=uid=07ef461a-0000-0000-6a059fa44a8870bf&invokePCL=true&paymentType=A&description=New Business Payment&firstName=Adam&surname=Har&addressLine1=20 Potters Road&city =伦敦&postalCode=EC1 4JS&payerUid=07ef3ff7-0000-0000-6a05-9fa42e92d56b&cardType=valid&continuousAuthority=true&makeCurrent=true

并在一个易于阅读的列表中(不带 &'s)

paymentType=A 
amount=147.06
policyUid=07ef493b-0000-0000-6a05-9fa4d6a5b5ad 
paymentMethod=A
script=Retail/accept.py
scriptParams=uid=07ef461a-0000-0000-6a059fa44a8870bf&invokePCL=true&paymentType=A 
description=New Business Payment 
firstName=Adam 
surname=Har
addressLine1=20 Chase road 
city=London 
postalCode=EC1 3PF
payerUid=07ef3ff7-0000-0000-6a05-9fa42e92d56b 
cardType=valid
continuousAuthority=true 
makeCurrent=true

这是我接受的带有正则表达式逻辑的 URL 参数:

paymentType=A&amount=([0-9]+.[0-9]{2})&policyUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9 ]+) $)&paymentMethod=([a-zA-Z]+)&script=([a-zA-Z]+/[a-zA-Z]+.py)&scriptParams=[a-zA-Z]{ 3}=(([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)))&description=([a-zA-Z0-9]+s )&firstName=[A-Za-z]&surname=[A-Za-z]&addressLine1=[a-zA-Z0-9 ]+&city=([a-zA-Z ]+)&postalCode=[a-zA- Z0-9 ]+&payerUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+) $)&cardType=[a-zA-Z]+&continuousAuthority =[a-zA-Z]+&makeCurrent=[a-zA-Z]+

再次在列表中:

registerPayment?outputType=xml
country=GB
paymentType=A
amount=([0-9]+.[0-9]{2})
policyUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*$)
paymentMethod=([a-zA-Z]+)
script=([a-zA-Z]+/[a-zA-Z]+.py)
scriptParams=[a-zA-Z]{3}=(([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)))
description=([a-zA-Z0-9 ]+s)
firstName=[A-Za-z]
surname=[A-Za-z]
addressLine1=[a-zA-Z0-9 ]+
city=([a-zA-Z ]+)
postalCode=[a-zA-Z0-9 ]+
payerUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*$)
cardType=[a-zA-Z]+
continuousAuthority=[a-zA-Z]+
makeCurrent=[a-zA-Z]+

我的问题是;为什么我的正则表达式和样本单独匹配,但是当我把它们放在一起时却没有?

附加问题:

我对整个 ScriptParams 参数使用逻辑 (([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+))) (这里的 & 是参数。)如果我只想获取“uid”部分并留下其余部分,我需要什么表达式来定位它(它由 Az az 0-9 和破折号组成)?

谢谢你

更新

我稍微调整了您的答案,因为我使用的存根服务器(?:[\s-])在加载包含 URL 模板的文件时不会接受。我还合并了很多 % 和 0-9 因为请求在匹配之前是 UTF 编码的(这是我没有预料到的),并且一些参数有我无法控制的流氓空间。除此之外,您的解决方案效果很好:)

这是我的新版本 scriptParams 正则表达式: &scriptParams=[a-zA-Z]{3}%3d[-A-Za-z0-9]+

这接受整个参数,并在正则表达式测试器中正常工作。现在,当我在这部分之后链接任何内容时,匹配不成功。

我不明白为什么这是一个问题,因为正则表达式似乎很好地串在一起。任何想法表示赞赏。

这是完整的正则表达式:

paymentType=[-%a-zA-Z0-9 ]+&amount=[0-9]+.[0-9]{2}&policyUid=([-A-Za-z0-9]+)&paymentMethod=([%a-zA-Z0-9]+)&script=[%/.a-zA-Z0-9]+&scriptParams=[a-zA-Z]{3}%3d[-A-Za-z0-9]+&description=[%a-zA-Z0-9 ]+&firstName=[-%A-Za-z0-9]+&surname=[-%A-Za-z0-9]+&addressLine1=[-%a-zA-Z0-9 ]+&city=[-%a-zA-Z 0-9]+&postalCode=[-%a-zA-Z 0-9]+&payerUid=([-A-Za-z0-9]+)&cardType=[%A-Za-z0-9]+&continuousAuthority=[A-Za-z]+&makeCurrent=[A-Za-z]+

这是完整的 URL 参数集(存在 UTF 编码):

paymentType=A&amount=104.85&policyUid=16a9cc22-0000-0000-5a96-5654d9a31f92&paymentMethod=A%20&script=RetailQuotes%2FacceptQuote.py%20&scriptParams=uid%3d16a9c958-0000-0000-5a96-565435311d07%26invokePCL%3dtrue%26paymentType%3dA%20&description=New%2520Business%2520Payment&firstName=Adam&surname=Har%20&addressLine1=26%2520Close&city=Potters%2520Town&postalCode=EC1%25206LR%20&payerUid=16a9c24e-0000-0000-5a96-5654b3f956e0&cardType=valid%20&continuousAuthority=true&makeCurrent=true

谢谢

PS(解决了服务器问题。我在使用 URL 参数时犯了一个小错误。)

4

1 回答 1

0

首先,您的正则表达式并非全部有效,有些缺少量词,有些则$出于某种原因而缺少一些参数!他们应该是这样的:

paymentType=A
amount=([0-9]+.[0-9]{2})
policyUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*)
paymentMethod=([a-zA-Z]+)
script=([a-zA-Z]+/[a-zA-Z]+.py)
scriptParams=[a-zA-Z]{3}=(([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)+))
invokePCL=([a-z]+)
paymentType=A
description=([a-zA-Z0-9 ]+)
firstName=[A-Za-z]+
surname=[A-Za-z]+
addressLine1=[a-zA-Z0-9 ]+
city=([a-zA-Z ]+)
postalCode=[a-zA-Z0-9 ]+
payerUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*)
cardType=[a-zA-Z]+
continuousAuthority=[a-zA-Z]+
makeCurrent=[a-zA-Z]+

结合起来,你会得到:

paymentType=A&amount=([0-9]+.[0-9]{2})&policyUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*)&paymentMethod=([a-zA-Z]+)&script=([a-zA-Z]+/[a-zA-Z]+.py)&scriptParams=[a-zA-Z]{3}=(([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)+))&invokePCL=([a-z]+)&paymentType=A&description=([a-zA-Z0-9 ]+)&firstName=[A-Za-z]+&surname=[A-Za-z]+&addressLine1=[a-zA-Z0-9 ]+&city=([a-zA-Z ]+)&postalCode=[a-zA-Z0-9 ]+&payerUid=([A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*)&cardType=[a-zA-Z]+&continuousAuthority=[a-zA-Z]+&makeCurrent=[a-zA-Z]+

正则表达式101演示

[注意,我把你的正则表达式放在它们匹配的地方,并对它们进行了最少的编辑]。

对于您的第二个问题,我不确定您所说的 Uid 部分是什么意思,这&是参数的一部分。鉴于 url 中有 3 个具有相似格式的 Uid(策略、脚本参数、用户),您必须将它们放在表达式中,除非您知道脚本参数的 Uid 的特定模式。

uid在下面的表达式中,我利用了只有 scriptparams'是小写的事实:

uid=[0-9a-f]+(?:-[0-9a-f]+)+

正则表达式101演示

于 2013-09-12T19:19:10.090 回答