кажется тривиальным, но мне трудно:
Кто-нибудь имеет подсказку для меня о том, как удалить управляющие символы, такие как 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, которые мы просто добавляем в конец.
Я думаю, что это будет намного менее напряженным для вас и сценария, а затем для работы с регулярным выражением и библиотекой регулярных выражений.