在PHP中验证此字符串格式“ A000AA00”的最佳/最快方法是什么?

时间:2019-02-13 18:45:47

标签: php regex

我需要验证我的字符串$path是否正好包含8个字符,并且$path的格式如下:A000AA00其中A是任何字母AZ,0是任何数字0- 9。

我做的第一件事是我使用strlen来获取字符串长度。

if (strlen($path) !== 8) { die('Bad string length'); }

接下来,我根据期望的ctype_alpha使用ctype_digit$path[0-7]来检查字符串是否符合我想要的格式。

if (ctype_alpha($path[0]) && ctype_digit($path[1]) && ctype_digit($path[2]) && ctype_digit($path[3]) && ctype_alpha($path[4]) && ctype_alpha($path[5]) && ctype_digit($path[6]) && ctype_digit($path[7])) { // We good }


我可以以某种方式改进此代码吗? 有没有更快的选择?

1 个答案:

答案 0 :(得分:0)

如果您打算使用正则表达式来验证这种模式,则可以尝试

preg_match('~^[A-Z]\d{3}[A-Z]{2}\d{2}\z~', $s)

regex方法非常易读:以大写字母,3位数字,2个大写字母,2位数字,字符串的结尾开头。

现在,

$path = "A000AA00";
$startA = microtime(true);
for($i = 0; $i < 100000; $i++)
{
  if (strlen($path) !== 8) { die('Bad string length'); }
  if (ctype_alpha($path[0]) && ctype_digit($path[1]) && ctype_digit($path[2]) && ctype_digit($path[3]) && ctype_alpha($path[4]) && ctype_alpha($path[5]) && ctype_digit($path[6]) && ctype_digit($path[7])) { // We good 
  }
}
$endA = microtime(true);
echo $endA-$startA;

yields 0.02226710319519(PHP 7.3.2),以及基于正则表达式的解决方案yields 0.0064888000488281