Обрезать пробел ASCII-символ " 194 " из строки

недавно столкнулся с очень странной проблемой, когда моя база данных содержит строки с тем, что кажется нормальными символами пробелов, но на самом деле что-то еще.

например, применяя trim() в строку:

"TEST "

получаю я:

"TEST "

как результат. Поэтому я копирую и вставляю последний символ в строку и:

echo ord(' ');
194

194? Согласно таблицам ASCII, это должно быть . Так что я просто сбит с толку. Почему? кажется ли этот символ пробелом и как я могу trim() символы, как это, когда trim() сбой?

4 ответов


вы можете попробовать с:

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);

или (я не уверен, что он будет работать хорошо)

$foo = "TEST ";
$foo = preg_replace('#[\xC2\xA0]#', '', $foo);

это, скорее всего, будет двухбайтовый 194 160 последовательность, которая является кодировкой UTF-8 кодовой точки пространства без перерыва (эквивалент   сущность в HTML).

это действительно не пространство, хотя оно выглядит как одно. (Вы увидите, что, например, это не будет обертыванием слов.) Регулярное выражение для \S будет соответствовать ему, но простое сравнение с пробелом не будет; и не будет trim() снимите ее.

чтобы заменить пробелы без перерыва нормальным пространством, вы должны уметь делать что-то вроде:

$string = str_replace("\u{c2a0}", " ", $string);

или

$string = str_replace("\u{c2a0}", "", $string);

снять их


была та же проблема. Решил это с

trim($str, ' ' . chr(194) . chr(160))

думал, что я должен внести свой собственный ответ, так как теперь мне стало ясно, что происходит. Проблема возникает при работе с html, который содержит неразрывный объект пространства, . После загрузки содержимого в php DOMDocument(), все сущности преобразуются в их декодированные значения, и при разборе ИТ вы получаете неразрывный пробел. В любом случае, даже в другом сценарии следующий метод является еще одним вариантом преобразования их в регулярные пробелы:

$foo = str_replace(' ',' ',htmlentities($foo));

это работает, сначала Преобразуя неразрывное пространство в его HTML-объект, а затем в обычное пространство. Содержание $foo Теперь можно легко обрезать как обычно.