1

我在课堂上有以下功能。

public function checkPostcodeFormat($postcode) {
    if (strlen($postcode) === 7 && substr($postcode, 5) !== " ") {
        return substr($postcode, 0, 4) . ' ' . substr($postcode, 4, 3);
    } elseif (strlen($postcode) === 6 && substr($postcode, 4) !== " ") {
        return substr($postcode, 0, 3) . ' ' . substr($postcode, 3, 3);
    } else {
        return $postcode;
    }
}

如果邮政编码是通过 substr 函数返回的,那很好,但如果它在 else 部分返回,则var_dump()表明它的长度错误。

var_dump($_POST["postcode"]);

节目

string(7) "ab1 1ab"

然而

var_dump($class->checkPostcodeFormat($_POST["postcode"]));

节目

string(8) "ab1 1ab"

如果只是通过函数返回,是什么导致字符串长度增加?

4

3 回答 3

2

如果$postcode是 format ab1 1ab,则第一个if条件将评估为TRUE并且该if块内的代码将被执行。对于上述输入, substr($postcode, 5) 将返回字符串ab。因此,只要邮政编码的长度substr($postcode, 5) !== " ")始终是. 而且您只是在返回字符串时添加了一个额外的空格。TRUE7

在处理字符串之前删除所有空间是个好主意。我改进了功能如下:

public function checkPostcodeFormat($postcode) {
    // remove all spaces in the post code
    $postcode = preg_replace('/\s+/', '', $postcode);

    if (strlen($postcode) === 6) {
        return substr($postcode, 0, 3).' '.substr($postcode, 3);
    } elseif (strlen($postcode) === 7) {
        return substr($postcode, 0, 4).' '.substr($postcode, 4);
    } 
}

测试用例:

var_dump( checkPostcodeFormat('AB11AB'));
var_dump( checkPostcodeFormat('AB121AB'));

输出:

string(7) "AB1 1AB"
string(8) "AB12 1AB"
于 2013-10-21T13:40:58.887 回答
1

解释:

您的 if 条件返回 8 个字符的字符串

substr($string, $start, $length)

所以,当你输入“ab1 1ab”

在if条件下

1)substr($postcode, 0, 4) return "ab1 " <=== first space comes from here
2)then you appends space <=== another one from here

接着

3)substr($postcode, 4, 3) appends "1ab"

他们一起返回 "ab1 1ab" <=== 两个空格

于 2013-10-21T13:42:36.290 回答
0

您的代码重复了空格,您的返回是“ab1 1ba”,但浏览器只显示一个。

http://sandbox.onlinephpfunctions.com/code/49a75148d3d5236359776b33a4701789dccd25bf

于 2013-10-21T13:34:29.460 回答