Как экранировать в php
Перейти к содержимому

Как экранировать в php

  • автор:

Как экранировать в php

Обратная косая черта (‘\’) имеет несколько применений. Прежде всего, если она предшествует не буквенно-цифровому символу, она снимает с него специальное значение, которое он мог иметь. Применение обратной косой черты как экранирующего символа допустимо как в символьном классе, так и вне него.

Например, если вы хотите задать соответствие символу «*», в шаблоне необходимо указать «\*». Это предотвратит трактование последующего символа как метасимвола с особым значением. Всегда безопасно экранировать не буквенно-цифровые символы с помощью «\», если вы хотите убедиться, что они означают в шаблоне самих себя. В частном случае для сопоставления с самим символом обратной косой черты, используйте запись «\\».

Замечание:

PHP-строки, заключённые в одинарные и двойные кавычки, по-особому интерпретируют обратную косую черту. Таким образом, если необходимо сопоставить \ с регулярным выражением \\, в PHP-коде нужно использовать «\\\\» или ‘\\\\’.

В случае, если указан модификатор PCRE_EXTENDED, пробельные символы в шаблоне (вне описания символьного класса) игнорируются. Также игнорируется часть строки, находящаяся между символом «#» (опять же, не участвующем в описании символьного класса) и следующим символом перевода строки. В таком случае обратный слеш можно применять как экранирующий символ для указания вхождений пробельных символов или символа «#» в шаблоне.

Второе применение обратного слеша заключается в том, что он позволяет использовать непечатные символы в видимой форме в описании шаблона. При том, что в PCRE нет ограничений на использование непечатных символов (исключая бинарный ноль, который интерпретируется как конец шаблона), при редактировании программного кода в каком-либо текстовом редакторе гораздо удобнее использовать следующие комбинации, чем реальные символы, которые они представляют:

\a символ оповещения, сигнал, (BEL, шестнадцатеричный код 07) \cx «Ctrl+x», где x — произвольный символ \e escape (шестнадцатеричный код 1B) \f разрыв страницы (шестнадцатеричный код 0C) \n перевод строки (шестнадцатеричный код 0A) \p символ со свойством xx, подробнее смотрите свойства unicode \P символ без свойства xx, подробнее смотрите свойства unicode \r возврат каретки (шестнадцатеричный код 0D) \R разрыв строки: совпадает с \n, \r и \r\n \t табуляция (шестнадцатеричный код 09) \xhh символ с шестнадцатеричным кодом hh \ddd символ с восьмеричным кодом ddd, либо ссылка на подмаску

Если быть более точным, комбинация » \cx » интерпретируется следующим образом: если » x » — символ нижнего регистра, он преобразуется в верхний регистр. После этого шестой бит символа (шестнадцатеричный код 40) инвертируется. Таким образом » \cz » интерпретируется как шестнадцатеричное значение 1A, в то время как » \c< " получает шестнадцатеричное значение 3B, а " \c; " - 7B.

После » \x » считываются ещё две шестнадцатеричные цифры (они могут быть записаны в нижнем или верхнем регистре). В режиме UTF-8, разрешается использование » \x <. >«, где содержимое скобок является строкой из шестнадцатеричных цифр. Она интерпретируется как символ UTF-8 character с кодом, совпадающим с данным шестнадцатеричным числом. Исходная шестнадцатеричная экранирующая последовательность, \xhh , совпадает с двухбайтным UTF-8 символом, если его значение превышает 127.

После » \0 » считываются две восьмеричные цифры. Если в записи менее двух цифр, будут использованы все фактически присутствующие цифры. Таким образом, последовательность » \0\x\07 » будет интерпретирована как два бинарных нуля, за которыми следует символ оповещения (звонок). В случае, если вы используете представление числа в восьмеричном коде, убедитесь, что за начальным нулём следуют две значащие цифры.

Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее. Вне символьного класса PCRE воспринимает обратный слеш и следующие за ним цифры как десятичное число. Если полученное значение меньше десяти, либо если шаблон содержит по меньшей мере такое же количество предшествующих текущей позиции подмасок, вся конструкция интерпретируется как ссылка на подмаску. Более детальное описание будет приведено ниже при обсуждении механизма работы подмасок.

Внутри символьного класса, либо если полученное значение больше 9 и соответствующее количество предшествующих подмасок отсутствует, PCRE считывает до трёх восьмеричных цифр, следующих за обратным слешем, и генерирует один байт из последних 8-ми значащих битов полученного значения. Все последующие цифры обозначают себя же. Например:

\040 ещё один способ записи пробела \40 то же самое в случае, если данной записи предшествует менее сорока подмасок \7 всегда интерпретируется как ссылка на подмаску \11 может быть как обратной ссылкой, так и альтернативной записью символа табуляции \011 всегда интерпретируется как символ табуляции \0113 символ табуляции, за которым следует цифра «3» \113 интерпретируется как символ с восьмеричным кодом 113 (так как ссылок на подмаски не может быть более чем 99) \377 байт, всецело состоящий из единичных битов \81 либо обратная ссылка, либо бинарный ноль, за которым следуют цифры «8» и «1»

Следует помнить, что восьмеричные значения, превышающие 100, следует писать без лидирующего нуля, так как читается не более трёх восьмеричных цифр.

Все последовательности, определяющие однобайтное значение, могут встречаться как внутри, так и вне символьных классов. Кроме того, внутри символьного класса запись » \b » интерпретируется как символ возврата (‘backspace’, шестнадцатеричный код 08). Вне символьного класса она имеет другое значение (какое именно, описано ниже).

Третье использование обратного слеша — указание общего типа символов:

\d любая десятичная цифра \D любой символ, кроме десятичной цифры \h любой горизонтальный пробельный символ \H любой символ, не являющийся горизонтальным пробельным символом \s любой пробельный символ \S любой непробельный символ \v любой вертикальный пробельный символ \V любой символ, не являющийся вертикальным пробельным символом \w Любой символ, образующий «слово» \W Любой символ, не образующий «слово»

Каждая пара таких специальных последовательностей делит полное множество всех символов на два непересекающихся множества. Любой символ соответствует одному и только одному множеству из пары.

Следующие символы считаются как «пробельные»: HT (9), LF (10), FF (12), CR (13), и пробел (32). Тем не менее, если идёт локале-зависимый поиск, и произойдёт совпадение с символами в диапазоне 128-255, они также будут восприняты как пробельные, например NBSP (A0).

Символ, образующий «слово» — это произвольная цифра, буква или символ подчёркивания, проще говоря, любой символ, который может являться частью «слова» в Perl. Определение букв и цифр управляется символьными таблицами, с которыми была собрана PCRE. И, как следствие, эти наборы могут отличаться в различных локализированных дистрибутивах. Например, в локали «fr» (Франция) некоторые символы с кодом выше 128 используются для записи ударных символов и, соответственно, соответствуют маске \w .

Описанные выше типы символов могут применяться как внутри, так и вне символьных классов, и соответствуют одному символу данного типа. Если текущая точка сравнения находится в конце строки, ни один из них не сможет совпасть, так как нет символа, с которым могло бы произойти совпадение.

Четвёртое использование обратного слеша — определение некоторых формальных утверждений, описывающих условия касательно месторасположения особых позиций в строке и совершенно не затрагивающих сами символы. Использование подмасок как более сложных формальных утверждений описано ниже. Такими управляющими последовательностями являются:

\b граница слова \B не является границей слова \A начало данных (независимо от многострочного режима) \Z конец данных либо позиция перед последним переводом строки (независимо от многострочного режима) \z конец данных (независимо от многострочного режима) \G первая совпадающая позиция в строке

Описанные выше последовательности не могут встречаться в символьных классах (исключая комбинацию » \b «, которая внутри класса означает символ возврата ‘backspace’).

Границей слова считается такая позиция в строке, в которой из текущего и предыдущего символа только один соответствует \w или \W (т.е. один из них соответствует \w , а другой \W ). Начало или конец строки также соответствуют границе слова в случае, если первый или, соответственно, последний символ совпадает с \w .

Специальные последовательности \A , \Z и \z отличаются от общеупотребляемых метасимволов начала строки ‘^’ и конца строки ‘$’ (описанных в разделе якоря) тем, что они всегда совпадают либо в самом начале либо в самом конце строки. На них никак не влияют опции PCRE_MULTILINE и PCRE_DOLLAR_ENDONLY. Разница между \Z и \z в том, что \Z соответствует позиции перед последним символом в случае, если последний символ — перевод строки, кроме самого конца строки. В то время, как \z соответствует исключительно концу данных.

Утверждение \G является истинным только в том случае, если текущая проверяемая позиция находится в начале совпадения, указанного параметром offset функции preg_match() . Она отличается от \A при ненулевом значении параметра offset .

\Q и \E могут быть использованы для игнорирования метасимволов регулярных выражений в шаблоне. Например: \w+\Q.$.\E$ совпадёт с один или более символов, составляющих «слово»,за которыми следуют символы .$. и якорь в конце строки. Обратите внимание, что это не меняет поведения разделителей; например, шаблон #\Q#\E#$ некорректен, потому что второй # отмечает конец шаблона, а \E# интерпретируется как недопустимые модификаторы.

Последовательность \K может быть использована для сброса начала совпадения. Например, шаблон foo\Kbar совпадёт с «foobar», но сообщит о том, что совпал только с «bar». Использование \K не мешает установке подмасок. Например, если шаблон (foo)\Kbar совпадёт со строкой «foobar», первой подмаской всё равно будет являться «foo».

addcslashes

Возвращает строку, экранированную обратными слешами перед символами, указанными в параметре characters .

Список параметров

Список экранируемых символов. Если characters содержит символы \n , \r и т.п., они будут преобразованы в стиле C, тогда как другие нецифробуквенные символы с ASCII-кодами ниже 32 и выше 126 будут преобразованы в восьмеричное представление.

Следует быть внимательным при указании диапазона символов в аргументе characters . Проверяйте, какие символы входят в этот диапазон.

echo addcslashes ( ‘foo[ ]’ , ‘A..z’ );
// выводит: \f\o\o\[ \]
// Будут экранированы заглавные и строчные английские буквы
// . а также [\]^_`
?>

Также, если ASCII-код первого символа диапазона больше, чем последнего, диапазон не будет создан. Вместо этого будут экранироваться только первый символ, последний символ и точка. Для определения ASCII-кода символов используйте функцию ord() .

echo addcslashes ( «zoo[‘.’]» , ‘z..A’ );
// выводит: \zoo[‘\.’]
?>

Будьте внимательны при экранировании символов 0, a, b, f, n, r, t и v. Они будут преобразованы в \0, \a, \b, \f, \n, \r, \t и \v, которые являются предопределёнными escape-последовательностями в языке Си. Многие из этих последовательностей также определены в других Си-подобных языках, включая PHP. Это означает, что вы можете не получить ожидаемого результата, если будете использовать вывод функции addcslashes() для создания кода в этих языках с использованием этих символов в characters .

Возвращаемые значения

Возвращает экранированную строку.

Примеры

characters , например, «\0..\37», что проэкранирует все символы с ASCII-кодами от 0 до 31.

Пример #1 Пример использования addcslashes()

$escaped = addcslashes ( $not_escaped , «\0..\37!@\177..\377» );
?>

Смотрите также

  • stripcslashes() — Удаляет экранирование символов, произведённое функцией addcslashes
  • stripslashes() — Удаляет экранирование символов
  • addslashes() — Экранирует строку с помощью слешей
  • htmlspecialchars() — Преобразует специальные символы в HTML-сущности
  • quotemeta() — Экранирует специальные символы

User Contributed Notes 6 notes

18 years ago

If you are using addcslashes() to encode text which is to later be decoded back to it’s original form, you MUST specify the backslash (\) character in charlist!

$originaltext = ‘This text does NOT contain \\n a new-line!’ ;
$encoded = addcslashes ( $originaltext , ‘\\’ );
$decoded = stripcslashes ( $encoded );
//$decoded now contains a copy of $originaltext with perfect integrity
echo $decoded ; //Display the sentence with it’s literal \n intact
?>

If the ‘\\’ was not specified in addcslashes(), any literal \n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it’s integrity through the encode-decode transaction.

16 years ago

addcslashes() treats NUL as a string terminator:

unless you order it backslashified:

assert(«any\\000body» === addcslashes(«any\0body», «\0»));

(Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)

21 years ago

I have found the following to be much more appropriate code example:

$escaped = addcslashes ( $not_escaped , «\0..\37!@\@\177..\377» );
?>

This will protect original, innocent backslashes from stripcslashes.

quotemeta

Возвращает модифицированную строку, в которой перед каждым символом из следующего списка:

вставлен обратный слеш ( \ ).

Список параметров

Возвращаемые значения

Возвращает экранированную строку или false , если в качестве параметра string была указана пустая строка.

Примеры

Пример #1 Пример использования quotemeta()

var_dump ( quotemeta ( ‘PHP is a popular scripting language. Fast, flexible, and pragmatic.’ ));
?>

Результат выполнения данного примера:

string(69) "PHP is a popular scripting language\. Fast, flexible, and pragmatic\."

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • addslashes() — Экранирует строку с помощью слешей
  • addcslashes() — Экранирует строку слешами в стиле языка C
  • htmlentities() — Преобразует все возможные символы в соответствующие HTML-сущности
  • htmlspecialchars() — Преобразует специальные символы в HTML-сущности
  • nl2br() — Вставляет HTML-код разрыва строки перед каждым переводом строки
  • stripslashes() — Удаляет экранирование символов
  • stripcslashes() — Удаляет экранирование символов, произведённое функцией addcslashes
  • preg_quote() — Экранирует символы в регулярных выражениях

User Contributed Notes 3 notes

14 years ago

$str = «Hello world. (can you hear me?)» ;
echo quotemeta ( $str );
?>

The output of the code above will be:
Hello world\. \(can you hear me\?\)

17 years ago

Took me a while to realize this was NOT the command I wanted for escaping potentially harmful characters in a string that would be used as part of a system command. Instead, I needed either escapeshellarg() (http://www.php.net/manual/en/function.escapeshellarg.php) or escapeshellcmd() (http://www.php.net/manual/en/function.escapeshellcmd.php)

22 years ago

This function escapes characters that have special meaning in regular expressions. preg_quote() has similar functionality, but is more powerful since it escapes more characters (including one user-specified character).

  • Copyright © 2001-2023 The PHP Group
  • My PHP.net
  • Contact
  • Other PHP.net sites
  • Privacy policy

Экранирование символов php

Вопрос в следующем: Есть несколько строк кода для отправки через json (т.е. строкой). Так как в html «+» является знаком конкатенации, язык разметки его просто сжирает и плюсик теряется. С этим разобрался. С кавычками не до конца смог. Пример 1 (все ок):

$text = 'Some "hard" text'; 

т.к. кавычки разного формата, пропускает. Но если взять пример 2:

$text = 'Some 'hard' text'; 

php ругается, т.к. думает, что кавычка перед hard — конец строки. Собственно, не удается даже создать текст в таком виде. Приблизительный код следующий:

$text = 'Some "ha'+'rd" text'; $patterns = array("/\+/","/\‘/","/\’/","/\“/","/\”/"); $replacements = array("%2B","%91","%92","%93","%94"); $text = preg_replace($patterns, $replacements, $text); 

Текст берется с текстового поля ввода, и перед каждым символом вставлять «\» никто не будет. Как сделать возможным содержание в тексте кавычек — одинаковых с теми, что служат началом и концом строки? т.е. так:

$text = 'Some 'hard' text'; 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *