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

Как удалить управляющие символы, такие как STX, из строки PHP? Я играл с

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

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

 rohu218720 авг. 2011 г., 11:28
Следующие ссылки могут помочь вам: <бр /> Таблица символов ASCII <br />POSIX ссылка <br />Регулярные выражения

Ответы на вопрос(5)

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

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

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

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

ereg_replace("[[:cntrl:]]", "", $pString);
 KB2230 сент. 2009 г., 15:05
Я должен исправить себя, для меня более точно: Эрег работает на деле.
 KB2230 сент. 2009 г., 15:02
Протестировано это, POSIX-классы, похоже, не работают. Спасибо за подсказку в любом случае!
 David15 окт. 2013 г., 18:47
ereg_replace устарела:php.net/manual/zh/function.ereg-replace.php
 Duroth30 сент. 2009 г., 14:57
PHP поддерживает POSIX, используя функции ereg вместо preg:nl2.php.net/manual/en/book.regex.php
 dereferenced01 нояб. 2011 г., 15:31
В моем тестировании это работало только при добавлении в квадрат дополнительной квадратной скобки, например: ereg_replace ("[[: cntrl:]] "," ", $ pString); PHP 5.3.5.
 Bobby30 сент. 2009 г., 15:47
@Duroth, спасибо за тестирование и информацию!

Чтобы сохранить управляющие символы, но сделать их совместимыми с 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 гласят: «Все символы Unicode могут быть помещены в кавычки, кроме символов, которые должны быть экранированы: кавычка, обратный солидус и управляющие символы (от U + 0000 до U + 001F). »)

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

 Chris Rosillo06 июл. 2017 г., 10:41
В терминах глупых людей (да, этоs me) может кто-нибудь любезно объяснить, как это работает. Это работает, я знаю, чтомы реализовали его с широким охватом модульных тестов, однако, когда я читаю его обратно с моим текущим пониманием, это нене имеет смысла. Насколько я понимаю, похоже, что это должно заменить все, чтоне контрольный персонаж или пустое пространство ни с чем? то есть тыв итоге остались только контрольные символы и оставшиеся пробелы ...? Заранее спасибо!
 syl.fabre08 нояб. 2016 г., 11:15
Почему вы используете\PC вместо ?\p{C}
 Wes Crow21 окт. 2014 г., 02:39
О, спасибо, Иисус!
 Scott Jungwirth08 нояб. 2016 г., 15:26
Мы должны использовать отрицательный символьный класс, чтобы избежать удаления пробелов (поскольку они считаются невидимыми), что означает, что нам нужно использовать обратную форму\p{C}
 Nostalg.io10 янв. 2017 г., 22:54
Это именно то, что вам нужно при отправке пользовательского ввода в API Authorize.net. В случае, если кто-то еще имеет недопустимые ошибки символов XML.
 Scott Jungwirth14 июл. 2017 г., 21:17
Привет @ChrisRosillo, мы используем обратную форму\p{C} который\PC, так где\p{C} соответствует контрольным символам, \ PC соответствует всему, что не 'управляющий персонаж. Затем мы используем отрицательный класс символов[^..] сказать, сопоставить / заменить что-нибудьне [не управляющий символ или пробел] ", Так что это своего рода двойной негатив.
метод регулярных выражений

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

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

$pString = str_replace(chr(127), "", $pString;

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

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

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

Просто ради удовольствия я придумал другой способ сделать это. Этот делает это, используя массив управляющих символов:

$ctrls = range(chr(0), chr(31));
$ctrls[] = chr(127);

$clean_string = str_replace($ctrls, "", $string);
 glomad30 сент. 2009 г., 17:08
Как это меньше?стрессовые» чем ereg_replace ("[: cntrl:] "," ", $ pString); ? Используя ereg, интерпретатор PHP, вероятно, скомпилирует более эффективный промежуточный код, чем в любом случае с использованием цикла for.
 Wiliam05 сент. 2012 г., 15:13
ereg_replace устарело с php 5.3.0
Решение Вопроса

Если вы имеете в виду под управляющими символамипервые 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 устарела в PHP>= 5.3.0 и удалено в PHP>= 7.0.0 !, пожалуйста, используйтеpreg_replace вместо :ereg_replace

preg_replace('/[[:cntrl:]]/', '', $input);
 Mnebuerquo27 апр. 2016 г., 18:13
@ford, я думаю твой комментарий с preg_replace ('/ [[: cntrl:]] / ',' '$ input); может быть другой ответ. Это был тот, который работал лучше всего для меня, и этоS похоронен в списке комментариев.
 ford04 дек. 2010 г., 00:22
Кроме того, preg_replace ('/ [[: cntrl:]] / ',' '$ input); работал у меня просто отлично (php 5.2.6).
 jcampbell124 сент. 2012 г., 22:06
Не то чтобы вы тоже могли сохранять вкладки\ Т», Я нашел этот вопрос, потому что я получал \ x1D в моей базе данных.
 ruhalde05 апр. 2012 г., 06:24
у меня не работает эта строка >>Rua Enette Dubard, 806 - Loja 2 " превращается в это >> "Rua Eee Dubad, 806 - Loja 2 "  и символ возврата каретки все еще там.
 Stephan20230 сент. 2009 г., 15:21
Спасибо KB22. Обратите внимание, что мое регулярное выражение было неверным, когда вы приняли мой ответ. Пожалуйста, смотрите обновленную версию.
 David15 окт. 2013 г., 19:25
Проверьте, почему preg_replace ('/ [[: cntrl:]] / ',' '$ input); ковшики:stackoverflow.com/questions/475159/...
 Jay Paroline18 июн. 2010 г., 23:53
к сожалению, ereg_replace устарело в PHP 5.3, а версия mb работает медленнее, чем preg_replace. Есть немного более чистый способ сделать это с помощью preg_replace, и в моем тестировании он был немного быстрее (на 1% быстрее при работе с сотнями тысяч элементов), чем приведенный выше: preg_replace ('/ [\ p {Cc}] / ',' '$ input);
 myol11 июн. 2015 г., 13:45
Для дезинфекции ввода с консоли первый preg_replace работал, но не второй (который я считал просто расширением первого)

Ваш ответ на вопрос