/*
 * 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 并不是按着你想的方式,清除,你认为的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 http://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 http://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 http://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;
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注