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

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

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'