почему 3 обратная косая черта равна 4 обратным слэшам в php?

<?php $a='/\\\/'; $b='/\\\\/'; var_dump($a);//string '/\\/' (length=4) var_dump($b);//string '/\\/' (length=4) var_dump($a===$b);//boolean true ?> 

Почему строка с тремя обратными косыми чертами равна строке с 4 обратными косыми чертами в PHP?

И можем ли мы использовать версию 3-backslash в регулярном выражении?

Ссылка на PHP говорит, что мы должны использовать 4 обратных слэша.

Примечание. Строки с одиночным и двойным кавычками имеют особое значение обратной косой черты. Таким образом, если \ нужно сопоставить с регулярным выражением \\ , то в PHP-коде необходимо использовать "\\\\" или '\\\\' .

Solutions Collecting From Web of "почему 3 обратная косая черта равна 4 обратным слэшам в php?"

 $b='/\\\\/'; 

php анализирует строковый литерал (более или менее) по символу. Первым символом ввода является косая черта. Результатом является косая черта в результате (шага синтаксического анализа) и входной символ (один символ, /) отбирается от входа.
Следующий входной символ – обратная косая черта. Он берется из ввода и проверяется следующий символ / символ. Это также обратная косая черта. Это допустимая комбинация, поэтому второй символ также берется из ввода, а результатом является одиночный черный знак (для обоих входных символов).
То же самое с третьим и четвертым обратным слэшем.
Последний входной символ (внутри литерального) – это форвард-лайт -> forwardlash в результате.
-> /\\/

Теперь для строки с тремя обратными косыми чертами:

 $a='/\\\/'; 

php «находит» первый blackslash, следующий символ – blackslash – это допустимая комбинация, в результате которой получается один черный штрих в результате и оба символа в введенном литерале. php затем «находит» третью черную ложку, следующий символ – косой чертой, это недействительная комбинация. Таким образом, результат – это один blackslash (потому что php любит и прощает вас ….) и только один символ, взятый из ввода. Следующий входной символ – это косая черта вперед, в результате чего получается результат в переднем плане.
-> /\\/

=> оба литерала кодируют одну и ту же строку.

Это объясняется в документации на странице о Strings :

В разделе Single quoted :

Самый простой способ указать строку – заключить ее в одинарные кавычки (символ).

Чтобы указать буквенную одинарную цитату, сбегите ее с помощью обратного слэша (\). Чтобы указать буквальную обратную косую черту, удвойте ее (\\). Все остальные экземпляры обратной косой черты будут рассматриваться как буквальная обратная косая черта.

Попробуем интерпретировать ваши строки:

 $a='/\\\/'; 

Прямые косые черты ( / ) не имеют особого значения в строках PHP, они представляют себя.
Первая обратная косая черта ( \ ) ускользает от второй обратной косой черты, как объясняется в первом предложении из второго абзаца, приведенного выше.
Третья обратная косая черта выступает сама по себе, как объясняется в последнем предложении вышеуказанной цитаты, потому что за ней не следует апостроф ( ' ) или обратная косая черта ( \ ).

В результате переменная $a содержит эту строку: /\\/ .

На

 $b='/\\\\/'; 

есть две обратные косые черты (вторая и четвертая), которые выходят из первого и третьего обратного слэша. Конечная строка (runtime) такая же, как для $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

Есть бесконечные возможности, чтобы усложнить ситуацию. Попробуем сделать их простыми и поместить некоторые рекомендации для regex в PHP :

  • приложите строку regex в апострофы ( ' ), если это возможно; таким образом, для PHP требуется только два символа: апостроф и обратная косая черта;
  • при анализе URL-адресов, путей или других строк, которые могут содержать косые черты ( / ), используйте # , ~ ! или @ как разделитель regex (который не используется в самом regex ); таким образом, нет необходимости избегать разделителя, когда он используется внутри regex ;
  • не убегайте в символы regex когда это не нужно; fe, черта ( - ) имеет особое значение только тогда, когда она используется в классах символов ; вне их бесполезно избегать этого (и даже в классах персонажей он может использоваться без кавычек без какого-либо особого значения, если он помещен как самый первый или последний символ внутри [...] корпуса [...] ;