-2

我想使用 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;
    }
}

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

4

2 回答 2

2

您检查的方式的问题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);
于 2019-10-31T17:59:38.620 回答
2

使用有效范围数组的另一种方法,然后检查它是否在数组中。请注意,您可以按位置访问字符串$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);
于 2019-10-31T18:07:20.463 回答