preg_replace для удаления непечатаемых символов, похоже, удаляет также все иностранные символы - PullRequest
6 голосов
/ 21 июля 2010

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

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

Есть ли проблемы с использованием этого в строках utf-8?Похоже, что полностью удаляются все не-ascii символы.

Ответы [ 2 ]

8 голосов
/ 21 июля 2010

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

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

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

6 голосов
/ 21 июля 2010

Вы можете использовать Свойства символов Юникода

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

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

Если вы хотите вернуть юникод в asciiотнюдь не в полной мере, но с некоторыми хорошими переводами:

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...