2014-12-01 86 views
0

是否可以将两种不同长度的字符串与preg_match匹配?如果是,如何?使用preg_match匹配具有两种不同固定长度的字符串

我正在寻找的是这样的:由于

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

,返回真,如果$string拉斯正好无论是13 25个字符的长度。

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

回答

1

我知道你的问题是关于用正则表达式来完成的,但通常是尽可能避免使用正则表达式的最佳做法。几个原因:

  • 你应该基准确定,但在大多数情况下,内置函数将超出正则表达式。
  • 许多编码器没有(彻底)理解正则表达式
  • 正则表达式通常不太灵活,只要将新的“业务规则”/要求投入混合。例如,如果你需要在长度为13的情况下添加一个需要做什么的事情,如果是25则有什么不同?或者,如果它是正确的字符但长度错误,可以做点什么?您将无法使用正则表达式编写这些代码()我下面介绍的解决方案并没有解决这些“假设”,但这里的区别在于您现在有能力根据需要分离这些东西

所以这里是一个非正则表达式的方法。

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

即使是这样的特定情况?如果你必须匹配'/^[a-z0-9] */i',但是如果字符串的长度是固定的,我可以看到区别。 – Alex 2014-12-01 16:53:42

+0

@Alex这不是说正则表达式*不能*在你的情况下完成工作,更重要的是是否使用正则表达式的原则和最佳实践。一般来说,内置函数的性能会更好,一般而言,非正则表达式解决方案更灵活,更易于理解,就其他编码人员而言,业务需求也会发生变化等。 – 2014-12-01 19:24:06

+0

@Alex不会误解我的意思..我是一个正则表达式的粉丝。这是完全性感的。但说实话,这是一个超级强大的工具,它的整体用途非常狭窄,从最佳实践PoV – 2014-12-01 19:25:06

3

这是一个快速的方法:

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