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