标准化加拿大邮政编码的功能正在返回意外结果

时间:2014-05-05 15:56:24

标签: php normalization

我试图规范加拿大邮政编码的用户输入。

最终目标是将所有输入作为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.

任何输入都将不胜感激。另外,如果您看到更好的规范化输入的方法,请分享!

1 个答案:

答案 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"(当然这只适用于特殊的这样的情况 - 如果它不是Oo,而是ab,则您仍然需要进行单独的比较。)