Обрезать пробел 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);
снять их
думал, что я должен внести свой собственный ответ, так как теперь мне стало ясно, что происходит. Проблема возникает при работе с html, который содержит неразрывный объект пространства, . После загрузки содержимого в php DOMDocument(), все сущности преобразуются в их декодированные значения, и при разборе ИТ вы получаете неразрывный пробел. В любом случае, даже в другом сценарии следующий метод является еще одним вариантом преобразования их в регулярные пробелы:
$foo = str_replace(' ',' ',htmlentities($foo));
это работает, сначала Преобразуя неразрывное пространство в его HTML-объект, а затем в обычное пространство. Содержание $foo Теперь можно легко обрезать как обычно.