Это объясняется в документации на странице о Strings
:
В разделе Single quoted
он говорит:
Самый простой способ указать строку — заключить ее в одинарные кавычки (символ '
).
Чтобы указать буквальную одинарную кавычку, закройте ее обратной косой чертой (\
). Чтобы указать буквальную обратную косую черту, удвойте ее (\\
). Все остальные экземпляры обратной косой черты будут рассматриваться как буквальная обратная косая черта.
Давайте попробуем интерпретировать ваши строки:
$a='/\\\/';
Прямая косая черта (/
) не имеет специального значения в строках PHP, они представляют сами себя.
Первая обратная косая черта (\
) экранирует вторую обратную косую черту, как объяснено в первом предложении второго абзаца, процитированного выше.
Третье Обратная косая черта обозначается сама по себе, как объяснено в последнем предложении приведенной выше цитаты, потому что за ней не следует апостроф ('
) или обратная косая черта (\
).
В результате переменная $a
содержит такую строку: /\\/
.
On
$b='/\\\\/';
есть две обратные косые черты (вторая и четвертая), которые экранируются первой и третьей обратными косыми чертами. Конечная строка (время выполнения) такая же, как и для $a
: /\\/
.
Примечание
Обсуждение выше касается кодирования строк в исходном коде PHP. Как видите, всегда существует более одного (правильного) способа кодирования одной и той же строки. Другими вариантами (помимо строковых литералов, заключенных в одинарные или двойные кавычки, с использованием синтаксиса heredoc
или nowdoc
) является использование констант (например, для литеральных обратных косых черт) и построение строк из частей.
Например:
define('BS', '\'); // can also use '\\', the result is the same
$c = '/'.BS.BS.'/';
не использует экранирование и одну обратную косую черту. Константа BS
содержит буквальную обратную косую черту и используется везде, где требуется обратная косая черта для ее внутреннего значения. Там, где для экранирования требуется обратная косая черта, используется настоящая обратная косая черта (для этого нельзя использовать BS
).
Побег в regex
— это совсем другое. Во-первых, regex
анализируется во время выполнения, а во время выполнения $a
, $b
и $c
выше содержат /\\/
, независимо от того, как они были сгенерированы.
Затем в regex
игнорируется обратная косая черта, за которой не следует специальный символ (см. разницу выше, в PHP
она интерпретируется как буквальная обратная косая черта).
Сочетание PHP и регулярных выражений
Есть бесконечные возможности все усложнить. Давайте постараемся сделать их простыми и поместим некоторые рекомендации для regex
в PHP
:
- заключите строку
regex
в апострофы ('
), если это возможно; таким образом, для PHP
нужно экранировать только два символа: апостроф и обратную косую черту;
- при анализе URL-адресов, путей или других строк, которые могут содержать косую черту (
/
), используйте #
, ~
, !
или @
в качестве разделителя regex
(какой из них не используется в самом regex
); таким образом, нет необходимости экранировать разделитель, когда он используется внутри regex
;
- не экранируйте
regex
символами, когда это не нужно; например, тире (-
) имеет особое значение только тогда, когда оно используется в классы персонажей; за их пределами его экранирование бесполезно (и даже в классах символов его можно использовать без кавычек без особого смысла, если он помещается как самый первый или самый последний символ внутри корпуса [...]
);
person
axiac
schedule
21.01.2015