Подтвердить что ты не робот

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

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

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

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

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

TIA

К

4b9b3361

Ответ 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, чем для регулярного выражения и библиотеки регулярных выражений.