PHP: ще раз про лапки, видалення пробілів і константи PHP_INI_ *
Типова задача виключення з введення користувача зайвих прогалин і / або тегів вирішується практично в кожному професійному скрипті на PHP.
Видалити теги легко стандартною функцією strip_tags. а ось щоб видалити всі зайві пробіли (в тому числі, між словами), нам недостатньо стандартної trim. як мінімум, потрібно використовувати регулярний вираз:
(Або альтернативне вираз, як ось тут).
Невирішеною залишиться тільки проблема з лапками. На жаль, при настройках PHP за замовчуванням (в тому числі, і в поточній версії 5.3.1), лапки з рядків, переданих методом POST або GET після введення користувача, при виведенні їх на екран можуть "екрануватися", тобто, символ "в коді перетвориться в # 92; ":
Введення "слово1" дасть на виході # 92; "слово1 # 92;". За настройки лапок в PHP 4-5 версій відповідають аж 3 змінних, в майбутньої 6 версії їх обіцяють прибрати.
magic_quotes_gpc - якщо директива включена, всі символи '. ". \ І NUL (байт з нульовим кодом) будуть автоматично екрануватися бекслешем \. З версії 5.3.0 опція оголошена застарілою, буде виключена в PHP 6.0.0. Чи не змінюється програмно у версіях старше 4.2.3. За замовчуванням включена, саме ця настройка "винна" в тому, що у нас сталося зі словом.
magic_quotes_runtime - якщо включена, то більшість функцій, які повертають дані з бази або текстових файлів, повертатимуть заекранувати тими ж бекслешамі подвійні і одинарні лапки. Але це ще не все! Якщо додатково включена директива magic_quotes_sybase. то екрануються тільки одинарні лапки, причому не зворотним слешем, а такий же одинарною лапкою! На щастя, цієї директиви можна управляти програмно, за замовчуванням вона виключена, в версії 5.3.0 оголошена застарілою, а в 6.0.0 буде скасована.
magic_quotes_sybase - як уже сказано, якщо ця опція включена, то змінюється правило екранування одинарної лапки, вона записується з додатковою одинарною лапкою замість зворотної косої межі, якщо magic_quotes_gpc або magic_quotes_runtime дозволені. Директивою можна управляти програмно, за замовчуванням вимкнена. Ніде не написано, що вона оголошена застарілою, але в PHP 6.0.0 директива також повинна бути скасована.
Як від усього цього не зійти з розуму і забезпечити коректну обробку лапок?
Я не раз вже приводив код функції magic. яка розбирається з цією проблемою, останнім часом вона стала ось такий:
Тобто, 2 директиви, які можна поставити програмно, так і ставляться (з видаленням контролю помилок оператором "@" - для майбутніх версій), третя директива перевіряється і при необхідності обробляються "зайві" бекслеші. Останнє виконується стандартною функцією stripslashes. хоча можна було б і "ручними" замінами, як я робив раніше:
Функцію get_magic_quotes_gpc також можна б було не викликати, обмежившись стандартної ini_get:
P.S. При такому підході функція stripslashes видалить поєднання символів # 92; "навіть там, де вона потрібна, наприклад, в цьому реченні. Як бути? Я просто в таких випадках заміняю символ" # 92; "Його HTML-кодом # 92;
Іноді доводиться вирішувати зворотну задачу - екранувати "небезпечні" символи зворотними Слеш. Додати бекслеші при вимкненому налаштування magic_quotes_gpc можна стандартною функцією addslashes. А ось якщо magic_quotes_gpc включена, робити addslashes не потрібно - вийде подвійне екранування. адже тоді функція addslashes і так автоматично застосовується до всіх даних GET. POST. і COOKIE.
Тепер повний код прикладу, що видаляє з введення теги, всі зайві пробіли між лексемами, що не залежить від налаштувань лапок і повертає лапки в форму, став таким:
(В прикладі не вистачає відкривають і закривають тегів HTML). Як бачите, перед тим як видати в тезі