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

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

— 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 протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку 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. Правильно настроить редактор так чтобы использовался Unix перевод, то есть только \n. Такое решение хорошо работает в обеих системах и не создает потенциальных проблем.

Задание

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

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

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


Советы
  • Обязательно поэкспериментируйте с выводом разных строк на сайте https://repl.it/languages/php

Упражнение доступно только для авторизованных пользователей