/*
 * PHP TRIM LTRIM RTRIM 是个坑 大坑
*/

// 看代码

$str = 'abc';
echo 'trim <br>';
var_dump(trim($str, 'bad'));

$str = 'CAT_';
echo 'trim <br>';
var_dump(trim($str, 'CATE_'));

$str = 'abc';
echo 'trim <br>';
var_dump(trim($str, 'ac'));

你认为返回是什么?

trim

string ‘c’ (length=1)

trim

string ” (length=0)

trim

string ‘b’ (length=1)

说明

string trim ( string $str [, string $charlist ] )

此函数返回字符串 str 去除首尾空白字符后的结果。如果不指定第二个参数, trim() 将去除这些字符:

    • ” ” (ASCII 32 (0x20)),普通空格符。
    • “\t” (ASCII 9 (0x09)),制表符。
    • “\n” (ASCII 10 (0x0A)),换行符。
    • “\r” (ASCII 13 (0x0D)),回车符。
    • “\0” (ASCII 0 (0x00)),空字节符。
  • “\x0B” (ASCII 11 (0x0B)),垂直制表符。

实际上,要特别注意的是:

Note: Possible gotcha: removing middle characters

Because trim() trims characters from the beginning and end of a string, it may be confusing when characters are (or are not) removed from the middle. trim(‘abc’, ‘bad’) removes both ‘a’ and ‘b’ because it trims ‘a’ thus moving ‘b’ to the beginning to also be trimmed. So, this is why it “works” whereas trim(‘abc’, ‘b’) seemingly does not.

注意:会删除中间字符

因为 trim() 从字符串的开头和结尾剔除字符,
从中间删除(或不删除)字符时,会造成混淆。
trim(‘abc’, ‘bad’),将删除 ab,因为,当a被删除后,b变成了开头。

这是它“工作”的情况,而 trim(‘abc’, ‘b’) 没有此类情况。

总之,trim 并不是按着你想的方式,清除,你认为的2边内容。还是老老实实,用 trim 清除不可见字符吧。

参见:PHP TRIM

2017-04-05 17:04-3 又一次被坑!!!

$param['path'] = '/Login/quit';
echo rtrim($param['path'], '.html');

你认为返回的是什么?上帝啊!!!竟是:

/Login/qui

竟把t给吃了!!!

综上所述,还是老老实实,用 trim 清除不可见字符吧!

新增加了3个函数:trimStr、ltrimStr、rtrimStr,分别用于解决以上问题。

/*
 * trim 字符串
 * 类似 php 函数 trim
 * @see https://ramble.3vshej.cn/php-trim-is-a-pit/ PHP TRIM 是个坑 大坑
 * @param string $str 源字符
 * @param string $list 待清除字符
 * @return string
*/
if ( ! function_exists('trimStr'))
{
    function trimStr($str, $list='') {

        $list = (string) $list;
        if (!isset($list[0])) return trim($str);
        $len1 = strlen($str);
        $len2 = strlen($list);
        if ($len2 > $len1) return trim($str);
        $str = ltrimStr($str, $list);
        $str = rtrimStr($str, $list);
        return $str;
    }
}

/*
 * ltrim 字符串
 * 类似 php 函数 ltrim
 * @see https://ramble.3vshej.cn/php-trim-is-a-pit/ PHP TRIM 是个坑 大坑
 * @param string $str 源字符
 * @param string $list 待清除字符
 * @return string
*/
if ( ! function_exists('ltrimStr'))
{
    function ltrimStr($str, $list='') {

        $list = (string) $list;
        if (!isset($list[0])) return ltrim($str);
        $len1 = strlen($str);
        $len2 = strlen($list);
        if ($len2 > $len1) return ltrim($str);

        $s = '';
        do {
            $s = substr($str, 0, $len2);
            if ($s == $list) $str = substr($str, $len2);
        } while($s == $list);

        return $str;

    }
}

/*
 * rtrim 字符串
 * 类似 php 函数 rtrim
 * @see https://ramble.3vshej.cn/php-trim-is-a-pit/ PHP TRIM 是个坑 大坑
 * @param string $str 源字符
 * @param string $list 待清除字符
 * @return string
*/
if ( ! function_exists('rtrimStr'))
{
    function rtrimStr($str, $list='') {
        $list = (string) $list;
        if (!isset($list[0])) return rtrim($str);
        $len1 = strlen($str);
        $len2 = strlen($list);
        if ($len2 > $len1) return rtrim($str);
        $s = '';
        do {
            $s = substr($str, -$len2);
            if ($s == $list) $str = substr($str, 0, -$len2);
        } while($s == $list);

        return $str;
    }
}

PHP TRIM 是个坑 大坑” 中有 2 条评论

  1. trim 第二个参数 $charlist 中的每一个字符不是一个整体,而是“或”的关系,类似:preg_replace(“(\.|h|t|m|l)/”, “”, $str);

    1. 赞同,最初用 trim 时,以为 $charlist 参数是一个整体,并不是单字符方式处理。

      以至于,一次次用错。

评论已关闭。