0

我有一个旧表单,仍然必须使用 cfform 进行客户端验证。

我还有一个用于验证的正则表达式模式,我正在尝试验证电话号码字符串。

<cfinput class="form-field" required="yes" value="#session.userdetails.shipping.deliveryaddress.telephoneNumber#" message="Please Enter your Phone Number" name="telephoneNumber" type="text"  id="PhoneNumber" validate="regex" pattern="^[0-9\.\-' ']+$"  maxlength="25" size="26" />

我尝试了许多不同的模式来将字符串验证为特定格式。

我需要它至少为 7 个字符 它可以包含空格 必须是数字

^[0-9\.\-' ']{7}+$
^[0-9\.\-' ']{7,}+$

关于为什么这不能满足我的要求的任何想法?

4

1 回答 1

0

“关于为什么这不能满足我的要求的任何想法?”

因为您使用的正则表达式包含 JS 不支持的语法 - 如果您查看浏览器控制台,您会在尝试验证时看到错误。(您可能需要选择“持久”选项才能看到它。)

您的错误是您要么将两个量词放在一起,要么可能已经看到所谓的所有格量词并尝试使用它(但 JS 不支持它们)。

解决方案是简单地{7,}不使用+after it,并且您的模式几乎可以按预期工作:不需要字符类中空格周围的引号(并且特别允许该字符),并且点不需要在 a 中转义字符类 - 所以你想要的模式是^[0-9.\- ]{7,}$or ^[\d .-]{7,}$


通过与其他类型相比,所有格量词的快速说明:

  • x{7,}是一个具有贪婪行为的量词,这意味着它与 x 匹配的次数尽可能多,但至少需要七次。
  • x{7,}+是具有所有格行为的量词,这意味着它匹配 x的次数与 found 一样多,但至少需要七次。
  • x{7,}?是一个具有惰性行为的量词,这意味着它尝试匹配 x 七次,然后尽可能少地成功匹配。
  • x+x{1,}你可以拥有x++x+?改变默认贪心量词的简写。

同样,JS 和 CF 使用的正则表达式实现不支持所有格量​​词(因此为什么语法无效),但它们确实支持贪婪(默认)和惰性。

占有欲和贪婪之间的区别可能看起来很微妙——对于你所拥有的单项模式来说,它实际上并没有生效——但它可以在执行中产生非常显着的差异......但这偏离了核心答案,所以我会在这里停下来。

于 2013-12-03T14:42:12.723 回答