Intereting Posts
php: Как сохранить сокет клиента (не закрыт), так что дополнительный скрипт может получить его для отправки ответа? 0 в корпусе выключателя? Оптимизация процесса поиска MySQL добавить разрыв строки между двумя переменными Как передать массив с помощью PHP и Ajax в Javascript? Используйте следующий возможный первичный ключ в столбце auto_increment после удаления одной или нескольких строк PHP – ini_set ('session.gc_maxlifetime', 5) – Почему он не заканчивает сеанс? Нарисуйте текст с помощью специального шрифта с помощью ImageMagick и PHP Разбор сложных данных JSON, возвращаемых API в javascript EDITED: он работал с PHP! CODE ADDED Эффективный способ проверить, находится ли текущая дата между двумя датами (годы не имеют значения) JSON – косые черты не ускользают Написание хинди-шрифтов с библиотекой GD не представляется желательным Как построить дерево в php с идентификаторами id, parent_id и глубиной Laravel PSR-4 автоматически не загружает классы Sonata Admin + показать все элементы в представлении списка (не на странице)

Удалить управляющие символы из php String

кажется тривиальным, но мне трудно:

Кто-нибудь имеет подсказку для меня о том, как удалить управляющие символы, такие как STX, из строки php. Я играл с

preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString) 

но обнаружил, что он много удалил. Есть ли способ удалить только контрольные символы?

ТИА

К

Если вы имеете в виду под управляющими символами первые 32 символа ascii и \x7F (включая возврат каретки и т. Д.!), Тогда это будет работать:

 preg_replace('/[\x00-\x1F\x7F]/', '', $input); 

(Обратите внимание на одинарные кавычки: с двойными кавычками использование \x00 приводит к ошибке синтаксического анализа.)

Возврат строки и возврат каретки (часто записанные \r и \n ) могут быть сохранены после удаления:

 preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $input); 

Я должен сказать, что, по-моему , ответ Бобби лучше, в том смысле, что [:cntrl:] лучше передает код, чем [\x00-\x1F\x7F] . Итак, используя ereg_replace вместо preg_replace :

ПРЕДУПРЕЖДЕНИЕ: ereg_replace устарел в PHP> = 5.3.0 и удален в PHP> = 7.0.0!

 ereg_replace('[:cntrl:]', '', $input); 

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

 <?php $clean = preg_replace('/[^\PC\s]/u', '', $input); 

для получения дополнительной информации о \p{C} см. http://www.regular-expressions.info/unicode.html#category

PHP поддерживает POSIX-классы, поэтому вы можете использовать [:cntrl:] вместо какого-либо причудливого характера-волшебства:

 ereg_replace("[:cntrl:]", "", $pString); 

Редактировать:

В 5.3 может понадобиться дополнительная пара квадратных скобок.

 ereg_replace("[[:cntrl:]]", "", $pString); 

Чтобы сохранить контрольные символы, но сделать их совместимыми для JSON, мне пришлось

 $str = preg_replace( array( '/\x00/', '/\x01/', '/\x02/', '/\x03/', '/\x04/', '/\x05/', '/\x06/', '/\x07/', '/\x08/', '/\x09/', '/\x0A/', '/\x0B/','/\x0C/','/\x0D/', '/\x0E/', '/\x0F/', '/\x10/', '/\x11/', '/\x12/','/\x13/','/\x14/','/\x15/', '/\x16/', '/\x17/', '/\x18/', '/\x19/','/\x1A/','/\x1B/','/\x1C/','/\x1D/', '/\x1E/', '/\x1F/' ), array( "\u0000", "\u0001", "\u0002", "\u0003", "\u0004", "\u0005", "\u0006", "\u0007", "\u0008", "\u0009", "\u000A", "\u000B", "\u000C", "\u000D", "\u000E", "\u000F", "\u0010", "\u0011", "\u0012", "\u0013", "\u0014", "\u0015", "\u0016", "\u0017", "\u0018", "\u0019", "\u001A", "\u001B", "\u001C", "\u001D", "\u001E", "\u001F" ), $str ); 

(В правилах JSON указано: «Все символы Юникода могут быть помещены в кавычки, за исключением символов, которые должны быть экранированы: кавычка, обратное солидус и управляющие символы (U + 0000 через U + 001F).»)

метод регулярного выражения

Если вы только перекодируете управляющие символы, с которыми я знаком (те, у кого есть 32 и 127), попробуйте это:

  for($control = 0; $control < 32; $control++) { $pString = str_replace(chr($control), "", $pString; } $pString = str_replace(chr(127), "", $pString; 

Петля избавляет от всех, кроме DEL, которые мы просто добавляем в конец.

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