所以我想检查我的输入字段是否包含特定的字符和整数。我唯一接受的值是这样的"KM00000"。必须以KM开头,后跟5个字符的整数。要检查字符串是否以字母'KM'开头,我可以这样做
if (substr($fm_id, 0, 2) !== "KM") {
die("<script>alert('ID is in the wrong format.');
window.history.back();</script>");
}
但是我不知道如何检查字母"KM"后面的字符后面是否跟一个整数
function check_classic($input) {
if( strlen($input) !== 7 ) {
return false;
}
if( substr($input, 0, 2) !== 'KM' ) {
return false;
}
for( $i=0,$c=5,$s=substr($input, 2, 5); $i<$c; ++$i ) {
$ord = ord($s[$i]);
// ord('0') == 48, ord('9') == 57
if( $ord < 48 || $ord > 57 ) {
return false;
}
}
return true;
}
function check_regex($input) {
return preg_match('/^KMd{5}$/', $input);
}
$inputs = [ 'KM12345', 'KM1234', 'KM123456', 'KM1234v' ];
foreach($inputs as $input) {
printf("Classic: %-8s %sn", $input, check_classic($input) ? 'true' : 'false');
printf("Regex: %-8s %sn", $input, check_regex($input) ? 'true' : 'false');
}
输出:
Classic: KM12345 true
Regex: KM12345 true
Classic: KM1234 false
Regex: KM1234 false
Classic: KM123456 false
Regex: KM123456 false
Classic: KM1234v false
Regex: KM1234v false
虽然正则表达式的代码行数肯定更少,但它是一种不同的特定于领域的语言。另外,我认为展示"经典"很重要。也是解决问题的一种方法,这大致就是正则表达式在底层所做的事情。
裁判:
- https://www.php.net/manual/en/function.ord.php
- https://www.php.net/manual/en/reference.pcre.pattern.syntax.php