Удалить управляющие символы из php String
кажется тривиальным, но мне трудно:
Есть ли у кого-нибудь намек на то, как удалить контрольные символы, такие как STX
из строки php. Я играл с
preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString)
но обнаружил, что он много удалил. Есть ли способ удалить только
контрольные символы?
TIA
К
Ответы
Ответ 1
Если вы имеете в виду под управляющими символами первые 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);
Ответ 2
Для ввода в Юникоде это приведет к удалению из вашего входного текста всех управляющих символов, неназначенного, частного использования, форматирования и суррогатных кодовых точек (которые также не являются символами пробела, такими как вкладка, новая строка). Я использую это, чтобы удалить все непечатаемые символы из моего ввода.
<?php
$clean = preg_replace('/[^\PC\s]/u', '', $input);
для получения дополнительной информации о \p{C}
см. http://www.regular-expressions.info/unicode.html#category
Ответ 3
PHP поддерживает POSIX-классы, поэтому вы можете использовать [:cntrl:]
вместо некоторого причудливого характера-волшебства:
ereg_replace("[:cntrl:]", "", $pString);
Edit:
В 5.3 может потребоваться дополнительная пара квадратных скобок.
ereg_replace("[[:cntrl:]]", "", $pString);
Ответ 4
Чтобы сохранить управляющие символы, но сделать их совместимыми для 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)". )
Ответ 5
метод без регулярного выражения
Если вы только зациклируете управляющие символы, с которыми я знаком (те, у которых есть 32 и 127), попробуйте это:
for($control = 0; $control < 32; $control++) {
$pString = str_replace(chr($control), "", $pString;
}
$pString = str_replace(chr(127), "", $pString;
Цикл избавляется от всех, кроме DEL, которые мы просто добавляем в конец.
Я думаю, что это будет намного менее напряженным для вас и script, чем для регулярного выражения и библиотеки регулярных выражений.