使用 ord() 验证

Validate With ord()

我想使用 ord() 从文本框中验证发布的数据(整数和大写小写字符串):

t1 是从 html 中的文本框发送的文本,

for($i=0; $i<strlen($t1); $i++){
    if(ord(substr($t1,$i,1))>64 || ord(substr($t1,$i,1))<123){
        if(ord(substr($t1,$i,1))>89 && ord(substr($t1,$i,1))<97 ||
            ord(substr($t1,$i,1))>122) {
            $validLoginInfoAcceptedUserName = false;
            break;
        }
    } else {
        $validLoginInfoAcceptedUserName = true;
        continue;
    }
}

我什么都试过了,但我卡住了,如果你知道问题出在哪里,请帮助我解决这个问题,但如果你不知道,请不要建议任何其他验证方式。

您使用 ord() 检查方式的问题在于,在某些情况下 $validLoginInfoAcceptedUserName 永远不会被设置,而在其他情况下您会错过部分字符范围正在尝试验证。

您可以使用单个 if 条件而不是嵌套条件来简化它。此外,您可以通过在检查结果之前将结果分配给变量来避免重复调用 ord()substr()

for ($i = 0, $l = strlen($t1); $i < $l; $i++) {
    $o = ord(substr($t1, $i, 1));
    if ($o < 48 || $o > 57 && $o < 65 || $o > 90 && $o < 97 || $o > 122) {
        $validLoginInfoAcceptedUserName = false;
        break;
    } else {
        $validLoginInfoAcceptedUserName = true;
    }
}

或者直接使用preg_match.

$validLoginInfoAcceptedUserName = preg_match('/^\p{Xan}*$/', $t1);

另一种方法是使用有效范围数组,然后检查它是否在数组中。请注意,您可以按位置 $t1[$i]:

访问字符串
$range = array_merge(range(48, 57), range(65, 90), range(97, 122));

for($i=0; $i<strlen($t1); $i++){
    if(!in_array(ord($t1[$i]), $range)) {
        $validLoginInfoAcceptedUserName = false;
        break;
    }
    $validLoginInfoAcceptedUserName = true;
}

只是为了好玩,您可以拆分字符串,将每个字符映射到 ord 并计算与范围的差异:

$range = array_merge(range(48, 57), range(65, 90), range(97, 122));
$array = array_map('ord', str_split($t1));

$validLoginInfoAcceptedUserName = !(array_diff($array, $range));

但是只需使用 ctype_alnum:

$validLoginInfoAcceptedUserName = ctype_alnum($t1);