Удалить управляющие символы из строки PHP
Если вы имеете в виду управляющие символы, первые 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 :
Спасибо КБ22. Обратите внимание, что мое регулярное выражение было неверным, когда вы приняли мой ответ. Пожалуйста, смотрите обновленную версию. — Stephan202
к сожалению, ereg_replace устарел в PHP 5.3, а версия mb работает медленнее, чем preg_replace. Есть немного более чистый способ сделать это с помощью preg_replace, и в моем тестировании он немного быстрее (на 1% быстрее при работе с сотнями тысяч элементов), чем приведенный выше: preg_replace(‘/[\p
у меня не работает, эта строка >> «Rua Enette Dubard, 806 — Loja 2» преобразуется в эту >> «Rua Eee Dubad, 806 — Loja 2», а символ возврата каретки все еще существует. — Рухальде
Не то чтобы вы также могли захотеть сохранить вкладки «\t». Я нашел этот вопрос, потому что получал \x1D в своей базе данных. — Джейкэмпбелл1
Для ввода Unicode это удалит все управляющие символы, неназначенные символы личного использования, форматирование и суррогатные кодовые точки (которые не являются также символами пробела, такими как табуляция, новая строка) из вашего вводимого текста. Я использую это, чтобы удалить все непечатаемые символы из моего ввода.
Мы должны использовать отрицательный класс символов, чтобы избежать удаления пробелов (поскольку они считаются невидимыми), что означает, что нам нужно использовать обратную форму \p
Это именно то, что вам нужно при отправке пользовательского ввода в API Authorize.net. В случае, если у кого-то еще есть недопустимые ошибки символов XML. — Ностальг.ио
Привет @ChrisRosillo, мы используем обратную форму \p
@syl.fabre о скобках: «Если с \p или \P указана только одна буква, она включает все свойства, начинающиеся с этой буквы. В этом случае, при отсутствии отрицания, фигурные скобки в управляющей последовательности необязательны» — Мигель Пинто
PHP поддерживает POSIX-классы, поэтому вы можете использовать [:cntrl:] вместо какой-то причудливой магии персонажей:
ereg_replace("[:cntrl:]", "", $pString);
ereg_replace("[[:cntrl:]]", "", $pString);
PHP поддерживает POSIX, используя функции ereg вместо preg: nl2.php.net/manual/en/book.regex.php — Дурот
В моем тестировании это работало только при добавлении дополнительной квадратной скобки к оператору, например: ereg_replace(«[[:cntrl:]]», «», $pString); PHP 5.3.5. — разыменованных
$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)».)
метод без регулярных выражений
Если вы меняете только те управляющие символы, с которыми я знаком (младше 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);
Как это менее «стрессово», чем ereg_replace(«[:cntrl:]», «», $pString); ? Используя ereg, интерпретатор PHP, вероятно, скомпилирует более эффективный промежуточный код, чем при использовании цикла for. — радость
Это тот случай, когда регулярное выражение, вероятно, более читабельно. Но мне нравится этот ответ, так как он, вероятно, имеет некоторое преимущество в производительности и будет работать без проблем практически при каждой установке PHP. Недурно! — Hiburn8
Ответ TLDR
$text = preg_replace('/[^\PCc^\PCn^\PCs]/u', '', $text);
Объяснение TLDR
- ^\PCc : Не сопоставьте контрольные символы.
- ^\PCn : Не соответствуют неназначенным символам.
- ^\PCs : Не соответствовать UTF-8-недопустимым символам.
Рабочая демонстрация
Простая демонстрация для демонстрации: Демо IDEOne
$text = "\uhello"; print($text . "\n\n"); $text = preg_replace('/[^\PCc^\PCn^\PCs]/u', '', $text); print($text);
(-Broken-Character)hello hello
альтернативы
- ^\PC : Соответствие только видимым символам. Не совмещайте невидимые символы.
- ^\PCc : Соответствие только неконтролирующим символам. Не совпадайте с управляющими символами.
- ^\PCc^\PCn : Соответствие только назначенным неконтролирующим символам. Не совпадайте ни с какими управляющими или неназначенными символами.
- ^\PCc^\PCn^\PCs : Соответствие только неконтролирующим символам, которые были назначены и являются допустимыми в кодировке UTF-8. Не сопоставляйте управляющие, неназначенные или недопустимые символы UTF-8.
- ^\PCc^\PCn^\PCs^\PCf : Соответствие только неконтролирующим, неформатирующим символам, которые были назначены и соответствуют UTF-8. Не сопоставляйте управляющие, неназначенные, форматирующие или недопустимые символы UTF-8.
Источник и объяснение
Взгляните на Свойства символов Юникода доступно, которое можно использовать для тестирования в регулярном выражении. Вы должны иметь возможность использовать эти регулярные выражения в Microsoft .NET, JavaScript, Питон, Java, PHP, рубин, Perl, Golang, И даже саман. Знание классов символов Юникода очень передаваемые знания, поэтому рекомендую его использовать!
Это регулярное выражение будет соответствовать всему видимому, как в краткой, так и в длинной форме .
\PL\PM\PN\PP\PS\PZ \PLetter\PMark\PNumber\PPunctuation\PSymbol\PSeparator
Как правило, \p указывает, что это то, что мы хотим сопоставить, и мы используем \P (с заглавной буквы) указать что-то, что не совпадает. Но PHP не имеет этой функциональности, поэтому нам нужно использовать ^ в регулярном выражении для ручного отрицания.
Тогда более простым регулярным выражением будет ^\PC , но это может быть слишком ограничительным при удалении невидимого форматирования. Вы можете присмотреться и посмотреть, что лучше всего, но одна из альтернатив должна соответствовать вашим потребностям.
Все сопоставимые наборы символов Unicode
Если вы хотите узнать о других доступных наборах символов, ознакомьтесь с регулярные-выражения.info.
- \PL or \PLetter : любое письмо с любого языка.
- \PLl or \PLowercase_Letter : строчная буква, имеющая вариант в верхнем регистре.
- \PLu or \PUppercase_Letter : заглавная буква, имеющая вариант в нижнем регистре.
- \PLt or \PTitlecase_Letter : буква, которая появляется в начале слова, если только первая буква слова заглавная.
- \PL& or \PCased_Letter : буква, существующая в нижнем и верхнем регистре (комбинация Ll, Lu и Lt).
- \PLm or \PModifier_Letter : специальный символ, который используется как буква.
- \PLo or \POther_Letter : буква или идеограмма без строчных и прописных букв.
- \PMn or \PNon_Spacing_Mark : символ, предназначенный для объединения с другим символом, не занимая лишнего места (например, акценты, умляуты и т. д.).
- \PMc or \PSpacing_Combining_Mark : символ, предназначенный для объединения с другим символом, занимающим дополнительное место (гласные во многих восточных языках).
- \PMe or \PEnclosing_Mark : символ, заключающий в себе символ, с которым он сочетается (круг, квадрат, колпачок и т. д.).
- \PZs or \PSpace_Separator : пробельный символ, который невидим, но занимает место.
- \PZl or \PLine_Separator : символ разделителя строк U + 2028.
- \PZp or \PParagraph_Separator : символ-разделитель абзацев U + 2029.
- \PSm or \PMath_Symbol : любой математический символ.
- \PSc or \PCurrency_Symbol : любой знак валюты.
- \PSk or \PModifier_Symbol : комбинированный символ (метка) как самостоятельный полный символ.
- \PSo or \POther_Symbol : различные символы, не являющиеся математическими символами, знаками валюты или комбинациями символов.
- \PNd or \PDecimal_Digit_Number : цифра от нуля до девяти в любом шрифте, кроме идеографических.
- \PNl or \PLetter_Number : число, которое выглядит как буква, например римская цифра.
- \PNo or \POther_Number : цифра верхнего или нижнего индекса или число, не являющееся цифрой 0–9 (за исключением чисел из идеографических шрифтов).
- \PPd or \PDash_Punctuation : любой дефис или тире.
- \PPs or \POpen_Punctuation : открывающая скобка любого вида.
- \PPe or \PClose_Punctuation : любая закрывающая скобка.
- \PPi or \PInitial_Punctuation : любая вступительная цитата.
- \PPf or \PFinal_Punctuation : любая заключительная цитата.
- \PPc or \PConnector_Punctuation : знак препинания, например подчеркивание, соединяющее слова.
- \PPo or \POther_Punctuation : любой знак препинания, кроме тире, скобки, цитаты или соединителя.
- \PCc or \PControl : управляющий символ ASCII или Latin-1: 0x00–0x1F и 0x7F – 0x9F.
- \PCf or \PFormat : невидимый индикатор форматирования.
- \PCo or \PPrivate_Use : любая кодовая точка, зарезервированная для частного использования.
- \PCs or \PSurrogate : половина суррогатной пары в кодировке UTF-16.
- \PCn or \PUnassigned : любая кодовая точка, которой не присвоен ни один символ.
ответ дан 11 мар ’21, в 16:03