为什么php trim并没有真正删除所有空格和换行符?

时间:2012-06-02 01:20:36

标签: php

我使用以下代码从文件中获取输入

$jap= str_replace("\n","",addslashes(strtolower(trim(fgets($fh), " \t\n\r"))));

我之前也尝试过这些故障排除

$jap= str_replace("\n","",addslashes(strtolower(trim(fgets($fh)))));
$jap= addslashes(strtolower(trim(fgets($fh), " \t\n\r")));

如果我回显$ jap它看起来很好,所以稍后在代码中,没有任何其他改变$ jap它被插入数据库,但是我注意到一个比较测试,检查这个jap是否已经在数据库返回当我可以清楚地看到在数据库中看似完全相同的日本条目时,这是假的。所以我复制了直接从phpmyadmin插入的jap条目,或者从显示jap的我的网站上插入并粘贴到记事本中我注意到它像这样粘贴...(这是一个完全粘贴到下面的引号)

バスにのって,うみへ行きました“

显然我需要,它没有那个空白区域和休息或者它是什么。

据我所知,修剪不会按照它说的那样做。或者我在这里遗漏了什么。如果是这样的话是什么?

更新: 关于杰克斯回答

preg_replace没有帮助,但这是我做的,我使用了 bin2hex()确定“不是我想要的部分”的部分 efbbbf 我这样做是通过将$ jap带入str替换并删除我希望找到的日语,剩下的就是bin2hex。结果是上面的“efbbbf”

echo bin2hex(str_replace("どちらがあなたの本ですか","",$jap));

以上的输出是efbbbf 但它是什么?我可以制作一个str_replace以某种方式删除它吗?

1 个答案:

答案 0 :(得分:22)

trim函数不知道Unicode空格。你可以试试这个:

preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $str);

取自:Trim unicode whitespace in PHP 5.2

否则,你可以bin2hex()找出前面添加的字符。

<强>更新

您的文件包含UTF8 BOM;删除它:

$f = fopen("file.txt", "r");
$s = fread($f, 3);
if ($s !== "\xef\xbb\xbf") {
    // bom not found, rewind file
    fseek($f, 0, SEEK_SET);
}
// continue reading here