字符串在通过函数后显示错误的长度

时间:2013-10-21 13:15:36

标签: php

我班上有以下功能。

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"

如果只是通过函数返回字符串,可能会导致字符串长度变大?

3 个答案:

答案 0 :(得分:2)

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

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

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"

答案 1 :(得分:1)

说明:

你的if条件是否返回8个字符串

substr($string, $start, $length)

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

in if condition

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”&lt; ===两个空格

答案 2 :(得分:0)

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

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