Экранирующие последовательности

Мы хотим показать диалог Матери Драконов со своим ребенком:

— Are you hungry?
— Aaaarrrgh!

Если вывести на экран строку с таким текстом:

print_r("— Are you hungry?— Aaaarrrgh!");

то получится так:

— Are you hungry?— Aaaarrrgh!

Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака.

В PHP \n — это перевод строки:

print_r("— Are you hungry?\n— Aaaarrrgh!");

результат:

— Are you hungry?
— Aaaarrrgh!

\n — это пример экранирующей последовательности (escape sequence). Их еще называют управляющими конструкциями.

Набирая текст в каком-нибудь Word вы нажимаете на Enter в конце строчки. Редактор при этом ставит в конец строчки специальный невидимый символ, который называется LINE FEED (LF, перевод строчки). В некоторых редакторах можно даже включить отображение невидимых символов. Тогда текст будет выглядеть примерно так:

— Привет!¶
— О, привет!¶
— Как дела?

Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать, например, перевод строки \n для правильного форматирования текста.

<?php

print_r("Gregor Clegane\nDunsen\nPolliver\nChiswyck");

Внимание! Экранирующие последовательности вроде \n работают только внутри двойных кавычек!

На экран выведется:

Gregor Clegane
Dunsen
Polliver
Chiswyck

Обратите внимание на следующие моменты:

1. Не имеет значения, что стоит перед или после \n: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.

2. Помните, что строка может содержать лишь один символ или вообще ноль символов? А еще строка может содержать только \n:

print_r("Gregor Clegane");
print_r("\n");
print_r("Dunsen");

Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:

Gregor Clegane
Dunsen

3. Не смотря на то, что в исходном тексте программы последовательность типа \n выглядит как два символа, с точки зрения интерпретатора это специальный один символ.

4. Если нам понадобится вывести \n именно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив еще один \ в начале. То есть последовательность \\n отобразится как символы \ и n идущие друг за другом.

print_r("Joffrey loves using \\n");

на экран выйдет:

Joffrey loves using \n

Небольшое, но важное, замечание про Windows. В Windows для перевода строк, по умолчанию, используется \r\n. Такая комбинация хорошо работает только в Windows, но создает проблем при переносе в другие системы. Например если в команде разработчиков есть пользователи как Windows так и Linux. Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине, в среде разработчиков, принято всегда использовать \n без \r, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n.

Задание

Напишите программу, которая выводит на экран:

— Did Joffrey agree?
— He did. He also said "I love using \n".

При этом программа использует только один print_r, но результат на экране должен выглядеть в точности как показано выше.


Советы
Определения
  • Экранирующая последовательность — специальная комбинация символов в тексте. Например, \n — это перевод строки.

Exercise available only for signed users