PHP正则表达式或字符串检查,以确保变量包含特定字符


php regex or string check to make sure a variable contains specific characters

我需要确保保存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