Escape sequences
Символ обратного слеша имеет несколько применений.Во-первых,если за ним следует не буквенно-цифровой символ,то он отнимает любое особое значение,которое может иметь этот символ.Такое использование обратного слеша в качестве экранирующего символа применяется как внутри,так и вне классов символов.
Например,если вы хотите,чтобы в шаблоне был указан символ «*»,то напишите «\*».Это применимо независимо от того,будет ли следующий символ интерпретироваться как мета-символ или нет,поэтому всегда безопасно предшествовать не-алфавитному символу с надписью «\»,чтобы указать,что он обозначает сам себя.В частности,если вы хотите,чтобы обратная косая черта совпадала,пишите «\\».
Note:
Строки PHP с одинарными и двойными кавычками имеют особое значение обратной косой черты. Таким образом, если \ необходимо сопоставить с регулярным выражением \\, тогда в PHP-коде необходимо использовать «\\\\» или ‘\\\\’.
Если шаблон компилируется с опцией PCRE_EXTENDED , пробелы в шаблоне (кроме класса символов) и символы между «#» вне класса символов и следующим символом новой строки игнорируются. Экранирующая обратная косая черта может использоваться для включения пробела или символа «#» как части шаблона.
Второе использование обратного слеша обеспечивает способ кодирования непечатаемых символов в шаблонах видимым образом.Нет никаких ограничений на появление непечатающихся символов,кроме бинарного нуля,который прерывает шаблон,но когда шаблон подготавливается редактированием текста,обычно проще использовать одну из следующих экранирующих последовательностей,чем бинарный символ,который он представляет:
\a тревога,то есть персонаж БЭЛ (гекс 07). \cx «control-x», где x — любой символ \e побег (гекс 1Б) \f формообразующее (hex 0C) \n newline (hex 0A) \p символ со свойством xx, дополнительную информацию см. в свойствах Unicode \P символ без свойства xx, дополнительную информацию см. в свойствах Unicode \r возврат каретки (шестнадцатеричное число) \R перенос строки:совпадает с \n,\r и \r\n. \t закладка (гекс 09) \xhh символ с шестнадцатеричным кодом \ddd символ с восьмеричным кодом ddd или обратной ссылкой
Точный эффект от « \cx » заключается в следующем: если « x » — это строчная буква, она преобразуется в верхний регистр. Затем бит 6 символа (шестнадцатеричный 40) инвертируется. Таким образом, » \cz » становится шестнадцатеричным 1A, но » \c< " становится шестнадцатеричным 3B, а " \c; " становится шестнадцатеричным 7B.
После » \x » читаются до двух шестнадцатеричных цифр (буквы могут быть в верхнем или нижнем регистре). В режиме UTF-8 допускается » \x <. >«, где содержимое фигурных скобок представляет собой строку шестнадцатеричных цифр. Он интерпретируется как символ UTF-8, кодовый номер которого является заданным шестнадцатеричным числом. Исходная шестнадцатеричная escape-последовательность \xhh соответствует двухбайтовому символу UTF-8, если значение больше 127.
После » \0 » читаются еще две восьмеричные цифры. В обоих случаях, если количество цифр меньше двух, используются только те, которые присутствуют. Таким образом, последовательность « \0\x\07 » определяет два двоичных нуля, за которыми следует символ BEL. Убедитесь, что вы указали две цифры после начального нуля, если следующий за ним символ является восьмеричной цифрой.
Обработка обратной косой черты, за которой следует цифра, отличная от 0, сложна. Вне класса символов PCRE считывает его и все последующие цифры как десятичное число. Если число меньше 10 или если в выражении было, по крайней мере, столько же предыдущих захватывающих левых скобок, вся последовательность берется как обратная ссылка . Описание того, как это работает, будет дано позже, после обсуждения заключенных в скобки подшаблонов.
Внутри класса символов,или если десятичное число больше 9 и не было столько захватывающих подмашин,PCRE повторно считывает до трех восьмеричных цифр,следующих за обратным слешем,и генерирует один байт из наименее значимых 8 бит значения.Любые последующие цифры стоят сами за себя.Например:
\040 ещё один способ написания пространства \40 это то же самое,при условии,что существует менее 40 предыдущих захватывающих подмастерн. \7 всегда обратная ссылка \11 может быть обратной ссылкой,или другим способом написания закладки. \011 всегда на вкладке \0113 это закладка,за которой следует символ «3». \113 это символ с восьмеричным кодом 113 (так как не может быть более 99 обратных ссылок). \377 байт,состоящий целиком из 1 бита \81 является либо задней ссылкой,либо двоичным нулем,за которым следуют два символа «8» и «1».
Обратите внимание,что восьмеричные значения 100 и более не должны вводиться ведущим нулем,так как никогда не считывается не более трех восьмеричных цифр.
Все последовательности, определяющие однобайтовое значение, могут использоваться как внутри, так и вне символьных классов. Кроме того, внутри класса символов последовательность « \b » интерпретируется как символ возврата (шестнадцатеричный код 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 word boundary \B ни одна граница слова \A запуск темы (независимо от многострочного режима) \Z конец темы или новая строка в конце (независимо от многострочного режима) \z конец предмета (независимо от многострочного режима) \G первое совпадение позиций по предмету
Эти утверждения могут не появляться в классах символов (но обратите внимание, что » \b » имеет другое значение, а именно символ возврата внутри класса символов).
Граница слова — это позиция в строке темы, в которой текущий и предыдущий символы не совпадают ни с \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».
PHP 8.2
Вне класса символов точка в шаблоне соответствует любой одной теме,включая непечатные,но не (по умолчанию)новую строку.
Настройки PCRE_CASELESS,PCRE_MULTILINE,PCRE_DOTALL,PCRE_UNGREEDY,PCRE_EXTRA,PCRE_EXTENDED и PCRE_DUPNAMES можно изменить из шаблона
addcslashes
Возвращает строку, экранированную обратными слешами перед символами, указанными в параметре characters .
Список параметров
Список экранируемых символов. Если characters содержит символы \n , \r и т.п., они будут преобразованы в стиле C, тогда как другие нецифробуквенные символы с ASCII-кодами ниже 32 и выше 126 будут преобразованы в восьмеричное представление.
Следует быть внимательным при указании диапазона символов в аргументе characters . Проверяйте, какие символы входят в этот диапазон.
echo addcslashes ( ‘foo[ ]’ , ‘A..z’ );
// выводит: \f\o\o\[ \]// Будут экранированы заглавные и строчные английские буквы
// . а также [\]^_`
?>?php
Также, если ASCII-код первого символа диапазона больше, чем последнего, диапазон не будет создан. Вместо этого будут экранироваться только первый символ, последний символ и точка. Для определения ASCII-кода символов используйте функцию ord() .
Будьте внимательны при экранировании символов 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()
Смотрите также
- stripcslashes() — Удаляет экранирование символов, произведённое функцией addcslashes
- stripslashes() — Удаляет экранирование символов
- addslashes() — Экранирует строку с помощью слешей
- htmlspecialchars() — Преобразует специальные символы в HTML-сущности
- quotemeta() — Экранирует специальные символы
User Contributed Notes 6 notes
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.
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.)
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.