我正在处理一些不同的表单验证类型,但无法让我的愿望 list 上的所有项目正常工作。
我的 cfinput 代码是这样的(与常规表单输入的工作方式相同,并且有一些预装的 JavaScript 验证)
<cfinput type="Text" name="negdays"
range="0,23"
pattern="^(([^0]{1})([0-9])*|(0{1}))?$"
message="Negative Days must be a number between 0 and 23"
required="No" width="2" >
这个应该而且确实排除了除 $
之外我需要的所有内容。我很难阻止表单接受 $
。
另一个类似的例子是我想要一个范围并保持其数字,所以我混合了验证类型
<cfinput type="text" name="achamount"
validate = "range,numeric"
range = "0,99999"
message="ACH Amount must be a range from 0 - 99999 and numeric only" >
...并且它工作完美 - 除了一个问题:允许使用 $
。
所以我想也许我可以用这样的正则表达式添加它:
<cfinput type="text" name="achamount"
validate = "range,numeric,regex"
range = "0,99999"
pattern="^\d"
message="ACH Amount must be a range from 0 - 99999 and numeric only" >
但我的模式当然只是将其限制为数字,我已经在这样做了。我需要我的模式来排除美元符号。但作为一个特殊 Angular 色,它的行为不像我想摆脱的其他东西。
有什么想法或建议吗?我尝试过的所有方法要么不起作用,要么破坏页面上的所有其他验证。
最佳答案
解决方案:仅匹配数字
您无需专门排除 $
- 仅允许数字,您只需确保每个字符都匹配 \d
.
为此,您需要将正则表达式的开头和结尾锚定到输入的开头和结尾,这是通过正则表达式元字符 ^
完成的和$
分别。 (如果您需要使用这些字符中的任何一个作为文字,请在它们前面加上反斜杠。)
因此,对于 0 到 99999 之间的整数,您需要:
^\d{1,5}$
匹配 0 到 23 之间的整数的工作方式相同,但模式的中心部分需要很复杂,以确保您不会得到 24 或以上:
^(?:[03-9]|1\d?|2[0-3]?)$
这里的三种选择是:
* [03-9]
匹配除 1 或 2 之外的任何单个数字。
* 1\d?
匹配 1 或 1 后跟任何数字。
* 2[0-3]?
匹配 2,或 2 后跟最多 3 的任何数字。
(?:
..)
是为了确保^
和$
仍然适用于整个字符串。
(当然,您也可以只使用^\d{1,2}$
,然后检查它是否小于24。)
奖励信息:不包括 Angular 色
如上所述,在这种情况下您不需要执行此操作,但如果您遇到确实需要排除 $
的情况。 ,您可以使用负字符类来做到这一点:
^[^$]{1,5}$
或者使用否定前瞻:
^(?:(?!\$).){1,5}$
后一个有点复杂,但它具有更大的灵 active ,因此了解一下很有用。
前瞻是 anchor 的另一种形式(它在某个位置匹配,但不消耗它匹配的字符)。当用于附加了量词({1,5}
位)的项目时,您需要将这两个项目组合在一起才能正确应用。 (即,如果您只执行 (?!\$).{1,5}
,则只会检查第一个字符,而不是所有五个字符。)
请注意,在字符类 $
之外必须转义为 \$
以防止它具有“弦 anchor 结尾”的特殊含义。在字符类中,它只是一个常规字符。
(希望这个解释很清楚 - 如果进一步的信息或澄清有用,请告诉我。)
关于javascript - 在 CF 的正则表达式中排除 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708867/