我需要确保保存product id
的变量只包含特定的字符。
对于纯整数变量,我使用is_numeric
来检查。
但是对于产品id,变量只能包含以下字符:
- 多个数字[0-9]
- 字符-(破折号)和/或_(下划线)
- 可以包含字母"s"或"c"(但不能同时包含)
例如,这是有效的:c23_2308724208_9873208
,这是有效的:12-c53_09872807342
,这是有效的:s23_208320720
但这是无效的:12-2352'; SELECT * FROM administrators;
.
我可以进入变量的格式是什么,但我不认为我需要,只要我确保变量只由上述组成。所有我想做的是把检查,以防止SQL注入。所以我认为我不需要关心格式,不是吗?我只是想确保给定的字符s,c,[0-9],[-,_]
可以在变量中找到,并且在这个有效字符范围之外没有任何内容。
编辑
根据某人的评论,格式必须严格遵守,那么确切的格式如下:
- 由数字和破折号组成的可选前缀(例如:132 -)
- 必需的字母(s或c)后面跟着一些数字,然后是下划线,然后是更多的数字(例如。s234_23872084732)
- 可选的下划线后缀,后面跟着更多的数字(所以这个例子的完整示例是
s234_23872084732_201874018743
)。
所以如果所有可选的东西都在那里,那么它就像132-s234_23872084732_201874018743
,如果只有必要的组件在那里,那么s234_23872084732
。
,但作为一个技术点,为什么有必要遵循严格的正则表达式?只要我确保只有必要的字符,SQL注入是不可能的,对吧?
类似?
/^([0-9]+-|)[cs][0-9_]+$/i
试试这个:
[0-9'-_]*[s|c]{1}[0-9_]+
-
[0-9'-_]*
匹配数字,破折号和下划线可以存在或不存在(*) -
[s|c]{1}
匹配s或c(一个应该存在({1})) -
[0-9_]+
匹配数字和下划线(至少一个应该出现(+))
你也可以试试;
/'b([0-9'-_]+)?([s|c])([0-9'-_]+)'b/i