Екранування рядків PHP
Готує рядок для вставки в одинарні чи подвійні лапки, у регулярний вираз або в шаблон LIKE.
Екранує рядок так, щоб PHP прочитав його як задумано
Рядок з апострофами, лапками, доларами чи зворотними слешами треба вставити в код так, щоб інтерпретатор не сприйняв частину тексту як синтаксис. Інструмент екранує під обраний контекст: одинарні лапки, подвійні лапки, heredoc, регулярний вираз через preg_quote і шаблон SQL LIKE.
У кожного контексту свій набір особливих символів. В одинарних лапках це лише ' і \, у подвійних додаються $ і керівні послідовності, у регулярному виразі дужки, крапка, плюс, зірочка, знак питання, у LIKE відсоток і підкреслення. Правило одне: екранувати на виході, у тому контексті, куди рядок іде, а не «про всяк випадок» при вводі.
$raw = "O'Reilly costs $5 (approx.)";
$single = '\'' . str_replace(['\\', '\''], ['\\\\', '\\\''], $raw) . '\'';
// 'O\'Reilly costs $5 (approx.)'
$pattern = '/' . preg_quote($raw, '/') . '/u';
// /O'Reilly costs \$5 \(approx\.\)/u
$like = addcslashes($raw, '%_\\'); // для LIKE ... ESCAPE '\'
Що питають про цей інструмент
Одинарні простіші: у них екрануються лише сам апостроф і зворотний слеш. У подвійних працюють інтерполяція змінних і керівні послідовності на кшталт \n, тому екранувати доводиться ще $ і подвійну лапку. Для статичних рядків беріть одинарні, для рядків зі змінними — подвійні або sprintf.
У регулярних виразах особливі символи інші: крапка, дужки, плюс, знак питання. preg_quote екранує саме їх, а другим аргументом ще й роздільник шаблону. addslashes для регулярок не годиться і робить рядок невалідним.
У LIKE відсоток і підкреслення це підстановки, тому в пошуковому запиті їх треба екранувати зворотним слешем і вказати ESCAPE '\\' у SQL, якщо база не вважає слеш екрануючим за замовчуванням. І це не заміна підготовлених виразів: значення все одно передавайте як параметр.