Я использую следующий regex для разделения непечатаемых управляющих символов от ввода данных пользователем прежде, чем вставить значения в базу данных.
preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value)
Существует ли проблема с использованием этого на строках utf-8? Это, кажется, удаляет все символы неASCII полностью.
Частично проблема в том, что вы не рассматриваете цель как строку UTF-8; для этого нужен модификатор /u
. Кроме того, в UTF-8 любой не-ASCII символ представлен двумя или более байтами, все они находятся в диапазоне \x80...\xFF
. Попробуйте так:
preg_replace('/\p{Cc}+/u', '', $value)
\p{Cc}
- это свойство Unicode для управляющих символов, а u
заставляет и регекс, и целевую строку обрабатываться как UTF-8.
Вы можете использовать свойства символа Unicode
preg_replace('/[^\p{L}\s]/u','',$value);
(добавьте другие классы, которые вы хотите пропустить)
Если вы хотите вернуть unicode в ascii, это ни в коем случае не является полным доказательством но с некоторыми хорошими переводами:
echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno'