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

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

 preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value)

Существует ли проблема с использованием этого на строках utf-8? Это, кажется, удаляет все символы неASCII полностью.

6
задан Greg 20 July 2010 в 23:13
поделиться

2 ответа

Частично проблема в том, что вы не рассматриваете цель как строку UTF-8; для этого нужен модификатор /u. Кроме того, в UTF-8 любой не-ASCII символ представлен двумя или более байтами, все они находятся в диапазоне \x80...\xFF. Попробуйте так:

preg_replace('/\p{Cc}+/u', '', $value)

\p{Cc} - это свойство Unicode для управляющих символов, а u заставляет и регекс, и целевую строку обрабатываться как UTF-8.

8
ответ дан 8 December 2019 в 15:58
поделиться

Вы можете использовать свойства символа Unicode

preg_replace('/[^\p{L}\s]/u','',$value);

(добавьте другие классы, которые вы хотите пропустить)

Если вы хотите вернуть unicode в ascii, это ни в коем случае не является полным доказательством но с некоторыми хорошими переводами:

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno'
7
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: