最近遇到一个非常奇怪的问题,我的数据库中包含了一些看起来像是普通空格字符的字符串,但实际上它们是其他东西。
例如,对该字符串应用trim()
函数:
"TEST "
让我感到:
"TEST "
结果是,所以我复制并粘贴字符串中的最后一个字符:
echo ord(' ');
194
194?根据ASCII表格应该是┬
。所以我现在很困惑。为什么这个字符看起来像空格,当使用trim()
失败时,如何trim()
这样的字符呢?
最近遇到一个非常奇怪的问题,我的数据库中包含了一些看起来像是普通空格字符的字符串,但实际上它们是其他东西。
例如,对该字符串应用trim()
函数:
"TEST "
让我感到:
"TEST "
结果是,所以我复制并粘贴字符串中的最后一个字符:
echo ord(' ');
194
194?根据ASCII表格应该是┬
。所以我现在很困惑。为什么这个字符看起来像空格,当使用trim()
失败时,如何trim()
这样的字符呢?
很有可能是由两个字节组成的194
160
序列,它是一个NO-BREAK SPACE码点的UTF-8编码(在HTML中等同于
实体)。
尽管看起来像空格,但它实际上不是空格。(例如,你会发现它不换行。)使用正则表达式匹配\s可以匹配它,但与空格进行简单比较、或使用trim()
都无法删除它。
要用正常空格替换NO-BREAK spaces,你可以尝试以下做法:
$string = str_replace("\u{c2a0}", " ", $string);
或者$string = str_replace("\u{c2a0}", "", $string);
去除它们
您可以尝试使用:
PHP的trim函数
$foo = "TEST ";
$foo = trim($foo);
PHP str_replace
$foo = "TEST ";
$foo = str_replace(chr(194), '', $foo);
重要提示:你可以尝试使用
chr(194).chr(160)
或者'\u00A0'
PHP preg_replace
$foo = "TEST ";
$foo = preg_replace('#(^\s+|\s+$)#', '', $foo);
OR(我不确定它是否能很好地运行)
$foo = "TEST ";
$foo = preg_replace('#[\xC2\xA0]#', '', $foo);
我遇到了同样的问题。通过以下方法解决:
trim($str, ' ' . chr(194) . chr(160))
您可能是从Excel / CSV中获取了原始数据。我正在将其导入到我的mysql数据库中,花费了几个小时才弄清楚为什么它会出现填充的情况,并且修剪似乎无法正常工作(必须检查每个CSV列字符串中的每个字符),但实际上它看起来像所有空格位于末尾。事实上,Excel似乎添加chr(32) + chr(194) + chr(160)以“填充”该列。这是对我有效的方法,以便拥有漂亮而完美的字符串用于加载到数据库中:
// convert to utf8
$value = iconv("ISO-8859-15", "UTF-8",$data[$c]);
// excel adds 194+160 to fill up!
$value = rtrim($value,chr(32).chr(194).chr(160));
// sanitize (escape etc)
$value = $dbc->sanitize($value);
我需要在PHP中截取字符串,但得到的结果都相同。
在发现Mark Bakers的回答后,我使用以下方法代替了trim
:
// $str = trim($str); // won't strip UTF-8 encoded nonbreaking spaces
$str = preg_replace('/^(\\s|\\xC2\\xA0)+|(\\s|\\xC2\\xA0)+$/', '', $str);
php -r 'print_r(json_encode(" "));'
"\u00a0"
$string = str_replace("\u{00a0}", "", $string); //not \u{c2a0}
我认为我应该贡献自己的答案,因为现在我已经清楚了发生了什么。问题源于处理包含非断空格实体
的html。一旦您在php的DOMDocument()
中加载内容,所有实体都会转换为其解码值,并在解析时得到一个非断空格字符。无论如何,在不同的情况下,以下方法是将它们转换为常规空格的另一种选择:
$foo = str_replace(' ',' ',htmlentities($foo));
这个方法首先将非断空格转换为其HTML实体,然后再转换为普通空格。现在可以像平常一样轻松地修剪$foo
的内容。
$string = html_entity_decode(" "); print ORD($string[0]);
输出:194
。 但是!你的解决方案无效。Codesmith的答案确实有效,我仍然会为你的解释点赞。 - HoldOffHunger