使用preg_match匹配具有两个不同固定长度的字符串

时间:2014-12-01 15:53:48

标签: php regex

是否可以使用preg_match匹配两个不同长度的字符串?如果是,怎么样?

我正在寻找类似的东西:

preg_match("/^[a-zA-Z0-9]{13|25}$/", $string);

如同,如果$string的长度恰好为13 25个字符,则返回true。

P.S。:我知道应该是{13,25} - {min,max} - ,但我对一段时间内的匹配不感兴趣。

3 个答案:

答案 0 :(得分:4)

这是一种快速的方式:

preg_match('/^[a-zA-Z0-9]{13}([a-zA-Z0-9]{12})?$/', $string);

答案 1 :(得分:3)

这样的东西
preg_match("/^([a-zA-Z0-9]{13}|[a-zA-Z0-9]{25})$/", $string);
  • ([a-zA-Z0-9]{13}|[a-zA-Z0-9]{25}交替匹配长度为13或25

示例http://regex101.com/r/bJ9vV5/1

答案 2 :(得分:1)

我知道您的问题是关于使用正则表达式进行此操作,但通常最好的做法是尽可能避免使用正则表达式。原因如下:

  • 您应该确定基准,但在大多数情况下,内置函数将胜过正则表达式。
  • 许多程序员都没有(完全)理解正则表达式
  • 就新的“业务规则”/要求而言,正则表达式通常不那么灵活。例如,如果长度为13,则需要添加要求执行某些操作,如果长度为25则需要添加一些内容,该怎么办?或者也许做一些事情,如果它是正确的字符,但错误的长度?单独使用正则表达式无法对这些内容进行编码(我在下面提供的解决方案不会解决这些“假设”,但这里的区别在于您现在可以根据需要分离这些内容

所以这是一种非正则表达式方法。

if ( in_array(strlen($string),array(13,25)) && ctype_alnum($string) ) {
  // good
} else {
  // bad
}