我试图规范加拿大邮政编码的用户输入。
最终目标是将所有输入作为A3A 3A3 - 7字符,大写,第一组字母编号,第二组作为数字字母编号。
用户有时会使用o或O代表数字0,反之亦然,所以这是我的功能:
$zip = htmlspecialchars($_REQUEST['zip']);
if (!empty($zip)) {
//if the format is A3A3A3, split it into two groups
if (strlen($zip) == 6) {
$zip = substr($zip, 0, 3) . " " . substr($zip, 3, 3);
}
//now lets make sure there is only a empty space between groups
if (strlen($zip) == 7) {
$zip[3] = " ";
}
//let's put their o's, O's and 0's in the right places
if ($zip[1] == ("O" || "o")) {
$zip[1] = '0';
}
if ($zip[4] == ('O'||'o')) {
$zip[4] = '0';
}
if ($zip[6] == ('O'||'o')) {
$zip[6] = '0';
}
if ($zip[0] == '0') {
$zip[0] = 'O';
}
if ($zip[2] == '0') {
$zip[2] = 'O';
}
if ($zip[5] == '0') {
$zip[5] = 'O';
}
//uppercase all the letters
strtoupper($zip);
}
我跑的第一个测试就是那种:
输入[0o0 O0o] =>输出[O0O 0O0]
一切看起来都很好我对自己说,它正在工作!但后来我尝试了一个正常的邮政编码并不断得到意想不到的结果:
输入[S7K3K1] =>输出[S0K 0K0]
我无法弄清楚为什么代码决定($ zip [1] ==(' O' ||' o')在$ zip时为真[1] == 7.
任何输入都将不胜感激。另外,如果您看到更好的规范化输入的方法,请分享!
答案 0 :(得分:0)
//let's put their o's, O's and 0's in the right places
if ($zip[1] == ("O" || "o")) {
$zip[1] = '0';
}
此代码不符合您的想法 - 您的比较逻辑是错误的,因为您对||
运算符的理解也是如此。
使用console.log(("O" || "o"))
并查看您在控制台中获得的内容 - ooops,这就是字母O
。为什么?因为JS中的||
逻辑或运算符返回的第一个值不是false-y。
你需要在这里写两个单独的比较,或者 - 或者联合那些 - $zip[1] == "O" || $zip[1] == "o"
,或者使用一个带有可能值的数组,然后检查你的变量值是否属于那些(但后者会有点在这里顶部)。
编辑:或者,正如bigmandan指出的那样,你也可以先将你的信转换成大写或小写,然后你只需做一次比较:($zip[1]).toLowerCase() == "o"
(当然这只适用于特殊的这样的情况 - 如果它不是O
或o
,而是a
或b
,则您仍然需要进行单独的比较。)