Введение: проблема с кавычками в PHP строках
Работа с кавычками в PHP — одна из тех задач, которая на первый взгляд кажется тривиальной, но на практике регулярно вызывает ошибки. Особенно часто проблема возникает при обработке данных из базы данных, внешних API, пользовательских форм и JSON-строк. В этой статье разберём все способы заменить двойные кавычки в строке PHP: от простого экранирования до регулярных выражений.
Экранирование кавычек в PHP
Начнём с основ. В PHP строки можно объявлять как в одинарных, так и в двойных кавычках. Если строка объявлена в двойных кавычках, то двойные кавычки внутри неё нужно экранировать обратным слешем:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // Экранирование обратным слешем $str = "Он сказал: \"Привет!\""; echo $str; // Он сказал: "Привет!" // Альтернатива — использовать одинарные кавычки снаружи $str2 = 'Он сказал: "Привет!"'; echo $str2; // Он сказал: "Привет!" // Heredoc — удобно для многострочных строк с кавычками $str3 = <<<EOT Он сказал: "Привет, мир!" EOT; echo $str3; ?> |
str_replace с двойными кавычками
Самый прямолинейный способ заменить двойные кавычки в строке PHP — использовать str_replace(). Функция принимает строку поиска, строку замены и исходную строку.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $str = 'Текст с "двойными" кавычками'; // Заменить двойные кавычки на одинарные $result = str_replace('"', "'", $str); echo $result; // Текст с 'двойными' кавычками // Заменить на HTML-сущность $result = str_replace('"', '"', $str); echo $result; // Текст с "двойными" кавычками // Удалить двойные кавычки $result = str_replace('"', '', $str); echo $result; // Текст с двойными кавычками // Заменить на типографские кавычки $result = str_replace('"', '«', str_replace('"', '»', $str)); ?> |
Важный момент: когда вы передаёте символ двойной кавычки в качестве аргумента str_replace, строку поиска нужно обернуть в одинарные кавычки или экранировать: '"' или "\"".
htmlspecialchars и htmlentities
Функции htmlspecialchars() и htmlentities() предназначены для безопасного вывода данных в HTML. Они автоматически заменяют специальные символы на HTML-сущности, включая двойные кавычки.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $str = 'Атрибут: value="текст" и <тег>'; // htmlspecialchars заменяет только основные символы echo htmlspecialchars($str); // Атрибут: value="текст" и <тег> // htmlspecialchars с флагом ENT_QUOTES заменяет оба вида кавычек echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // htmlentities заменяет все HTML-символы echo htmlentities($str, ENT_QUOTES, 'UTF-8'); // Обратная операция — декодирование HTML-сущностей $encoded = '"текст"'; echo htmlspecialchars_decode($encoded); // "текст" echo html_entity_decode($encoded, ENT_QUOTES, 'UTF-8'); // "текст" ?> |
Разница между » и " в HTML
Понимание разницы между символом двойной кавычки (") и его HTML-представлением (") важно для правильной работы с данными:
"— сам символ двойной кавычки (Unicode U+0022)"— HTML-сущность, которую браузер отображает как"- Внутри HTML-атрибутов двойные кавычки должны быть заменены на
", иначе атрибут «закроется» раньше времени - В обычном тексте страницы оба варианта визуально идентичны
|
1 2 3 4 5 6 |
<?php // Правильный вывод значения в атрибут HTML $value = 'Текст с "кавычками"'; echo '<input value="' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '">'; // <input value="Текст с "кавычками""> ?> |
Замена кавычек в JSON строках
При работе с JSON двойные кавычки — ключевой синтаксический элемент. Неправильная обработка кавычек ломает JSON-структуру. Используйте встроенные функции PHP для работы с JSON:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // Правильный способ — использовать json_encode $data = ['title' => 'Текст с "кавычками"', 'value' => 42]; $json = json_encode($data, JSON_UNESCAPED_UNICODE); echo $json; // {"title":"Текст с \"кавычками\"","value":42} // Декодирование $decoded = json_decode($json, true); echo $decoded['title']; // Текст с "кавычками" // Если нужно вручную экранировать кавычки для JSON $str = 'Текст с "кавычками"'; $escaped = addslashes($str); echo $escaped; // Текст с \"кавычками\" ?> |
addslashes и stripslashes
Функция addslashes() добавляет обратный слеш перед двойными кавычками, одинарными кавычками и обратным слешем. Исторически использовалась для экранирования данных перед SQL-запросами, но сейчас для этого нужно использовать подготовленные запросы PDO.
|
1 2 3 4 5 6 7 8 9 10 11 |
<?php $str = 'Он сказал "Привет" и пошёл'; // Добавить слеши $escaped = addslashes($str); echo $escaped; // Он сказал \"Привет\" и пошёл // Убрать слеши $original = stripslashes($escaped); echo $original; // Он сказал "Привет" и пошёл ?> |
Практический пример: очистка данных из БД и API
Рассмотрим реальный сценарий: данные из API содержат кавычки и их нужно безопасно вывести в HTML-шаблоне и сохранить в базу данных:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php // Данные из внешнего API $apiData = [ 'title' => 'Продукт "Премиум" версия 2.0', 'description' => 'Содержит символы: " \' < > &', ]; // Для вывода в HTML — htmlspecialchars echo '<h1>' . htmlspecialchars($apiData['title'], ENT_QUOTES, 'UTF-8') . '</h1>'; // Для записи в атрибут data-* echo '<div data-title="' . htmlspecialchars($apiData['title'], ENT_QUOTES, 'UTF-8') . '">'; // Для JavaScript — json_encode echo '<script>var title = ' . json_encode($apiData['title'], JSON_UNESCAPED_UNICODE) . ';</script>'; // Для PDO запроса — используйте prepared statements, НЕ str_replace $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $stmt = $pdo->prepare('INSERT INTO products (title) VALUES (:title)'); $stmt->execute([':title' => $apiData['title']]); // PDO сам экранирует ?> |
Замена кавычек через регулярное выражение
Для сложных случаев, когда нужно заменить кавычки по определённому паттерну (например, только в начале слова или только парные кавычки), используйте preg_replace():
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $str = 'Слово "первое" и "второе" в тексте'; // Заменить всё содержимое в кавычках вместе с кавычками $result = preg_replace('/"[^"]*"/', '[СКРЫТО]', $str); echo $result; // Слово [СКРЫТО] и [СКРЫТО] в тексте // Заменить двойные кавычки на типографские («») $result = preg_replace_callback('/"([^"]*)"/', function($matches) { return '«' . $matches[1] . '»'; }, $str); echo $result; // Слово «первое» и «второе» в тексте ?> |
Выбор подхода для замены двойных кавычек в строке PHP зависит от контекста: для HTML-вывода используйте htmlspecialchars, для JSON — json_encode, для простых замен — str_replace, для сложных паттернов — preg_replace. Никогда не используйте addslashes как замену подготовленным запросам PDO при работе с базой данных.

