Обрезать пробел 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
Теперь можно легко обрезать как обычно.