W3docs

Экранирование специальных символов в JavaScript

Экранирование специальных символов в JavaScript: кавычки, обратная косая черта, управляющие последовательности, шаблонные строки и JSON.stringify.

Введение

В JavaScript экранирование специальных символов является фундаментальным навыком разработчика, позволяющим создавать строки, содержащие символы, которые иначе интерпретировались бы языковым процессором особым образом. Эта статья подробно рассматривает методы и важность экранирования специальных символов, давая разработчикам знания и инструменты для эффективной работы со сложными строками.

Понимание специальных символов

Специальный символ — это любой символ, который JavaScript-парсер иначе воспринял бы как часть синтаксиса, а не как буквальный текст. Наиболее важные из них делятся на две группы:

  • Ограничители строк — символы кавычек ', " и `, обозначающие начало и конец строки.
  • Управляющие последовательности — комбинации, начинающиеся с обратной косой черты (\) и представляющие символы, которые сложно набрать или которые невидимы, например символ новой строки или табуляции.

Если поместить закрывающую кавычку того же типа внутрь строки, парсер решит, что строка завершилась раньше, и остаток строки станет синтаксической ошибкой. Экранирование решает эту проблему.

Общие управляющие последовательности

Следующие последовательности с обратной косой чертой распознаются внутри строковых литералов JavaScript:

ПоследовательностьЗначение
\nНовая строка (перевод строки)
\tГоризонтальная табуляция
\rВозврат каретки
\\Буквальная обратная косая черта
\'Буквальная одинарная кавычка
\"Буквальная двойная кавычка
\`Буквальный обратный апостроф
\uXXXXКодовая точка Unicode (например, é — это é)
\u{XXXX}Кодовая точка Unicode в шестнадцатеричном виде (например, \u{1F600} — это 😀)

Любой символ, не начинающий распознанную управляющую последовательность, просто теряет обратную косую черту: '\q' является просто 'q'.

Как экранировать специальные символы в строках

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

Главное правило для кавычек: нужно экранировать только ту кавычку, которая совпадает с ограничителем вашей строки. Строка в одинарных кавычках может содержать неэкранированные двойные кавычки, и наоборот.

Пример: экранирование кавычек

javascript— editable

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

Избегание экранирования с помощью шаблонных строк

Современный JavaScript также поддерживает шаблонные строки (обратные апострофы), которые позволяют включать как ', так и " без экранирования, охватывать несколько строк и встраивать выражения с помощью ${...}. Внутри шаблонной строки необходимо экранировать только обратные апострофы и ${.

javascript— editable

Это выводит две строки с обоими стилями кавычек без использования обратных косых черт.

Экранирование в регулярных выражениях

Регулярные выражения также используют специальные символы, и их экранирование крайне важно для сопоставления шаблонов. Метасимволы, такие как . (любой символ), * (повторение), +, ?, (, ), [, ], {, }, ^, $, | и \, имеют особые значения, поэтому для их буквального совпадения необходимо экранировать их обратной косой чертой.

Обратная косая черта в регулярных выражениях выполняет две разные роли:

  • Она экранирует метасимвол, чтобы он совпадал буквально — \. совпадает с настоящей точкой.
  • Она вводит сокращение класса символов\d совпадает с цифрой, \w — с символом слова, \s — с пробельным символом. Здесь обратная косая черта является частью токена, а не экранирует букву.
Внимание

When you build a regex from a string (via new RegExp(...)) every backslash must be doubled, because the string parser consumes one backslash before the regex engine ever sees it. new RegExp('\\d+') is equivalent to the literal /\d+/.

Пример: совпадение с буквальной точкой

javascript— editable

Обратите внимание, что правила экранирования строк и правила экранирования в регулярных выражениях независимы. В строках обратные косые черты экранируют кавычки и создают управляющие символы; в регулярных выражениях они экранируют метасимволы или формируют сокращения вроде \d.

Экранирование символов особенно полезно в следующих случаях:

  • Веб-разработка: обеспечение того, чтобы введённые пользователем данные не нарушали код.
  • Разбор данных: корректная обработка файлов данных, содержащих специальные символы.

Пример: экранирование пользовательского ввода

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Sanitize Input Example</title>
        <script>
            function sanitizeInput(input) {
              // This function replaces less-than and greater-than characters with HTML entities
              // to prevent malicious scripts from executing when the input is rendered as HTML.
              const sanitized = input.replace(/</g, '&lt;').replace(/>/g, '&gt;');
              return sanitized;
            }
            function displaySanitizedInput() {
              const unsafeInput = document.getElementById('unsafeInput').value;
              const sanitized = sanitizeInput(unsafeInput);
              document.getElementById('output').textContent = sanitized;
            }
        </script>
    </head>
    <body>
        <h1>Input Sanitization Example</h1>
        <p>
            Enter any HTML content below, including potentially harmful scripts.
            The example will sanitize the input to prevent script execution,
            displaying how it would be rendered safely on a web page.
        </p>
        <label for="unsafeInput">Enter unsafe content:</label>
        <input
            type="text"
            id="unsafeInput"
            value="<script>alert('hack')</script>"
        />
        <button onclick="displaySanitizedInput()">Sanitize and Display</button>
        <p>
            <span style="color:gray">Sanitized Output:</span>
            <span id="output"></span>
        </p>
    </body>
</html>

Этот HTML-пример предоставляет поле ввода, в котором пользователи могут вводить потенциально небезопасное содержимое, например тег <script>. При нажатии кнопки вызывается функция JavaScript sanitizeInput, которая очищает ввод и обновляет текстовое содержимое элемента <span> для отображения очищенного результата. Обратите внимание, что в этом примере экранируются только символы < и >. В продакшене следует также экранировать кавычки (" и ') и использовать специализированную библиотеку санитизации для предотвращения уязвимостей в контекстах атрибутов.

Доверьте экранирование языку

В большинстве реальных случаев экранирование должно выполняться встроенными инструментами, а не вручную — это позволяет избежать незаметных ошибок:

  • JSON: JSON.stringify() автоматически экранирует кавычки, обратные косые черты и управляющие символы, а JSON.parse() выполняет обратную операцию. См. Работа с JSON.
  • URL: encodeURIComponent() экранирует символы, небезопасные в строке запроса.
  • Regex из пользовательского ввода: экранируйте все метасимволы перед построением шаблона.

Пример: встроенное экранирование

javascript— editable

Рекомендации по экранированию символов

  • Экранируйте только ту кавычку, которая совпадает с ограничителем вашей строки, или смените ограничитель, чтобы полностью избежать экранирования.
  • Отдавайте предпочтение шаблонным строкам для строк, сочетающих разные стили кавычек или охватывающих несколько строк.
  • Не забывайте удваивать обратные косые черты при передаче шаблона в new RegExp().
  • Используйте JSON.stringify, encodeURIComponent и специализированную библиотеку санитизации вместо ручного экранирования.
  • Тестируйте строки и шаблоны регулярных выражений, чтобы убедиться в их корректном поведении.

Заключение

Владение управляющими последовательностями в JavaScript расширяет возможности разработчика по эффективной работе со строками и данными. Будь то веб-приложения или серверные скрипты, понимание принципов экранирования специальных символов необходимо для написания надёжного кода без ошибок.

Практика

Практика
Какие из следующих утверждений правильно описывают правила экранирования специальных символов в регулярных выражениях JavaScript?
Какие из следующих утверждений правильно описывают правила экранирования специальных символов в регулярных выражениях JavaScript?
Was this page helpful?