Екранування регулярного виразу в php
Не так давно один з учасників мого форуму виявив помилку у мене на сайті. Якщо ввести "/"В форму пошуку, то видавалася помилка. Начебто нічого серйозного, але це не дуже добре. Тому цю помилку я відразу знайшов і виправив. А помилка була в тому, що я дещо забув врахувати. Це трохи пов`язано з екрануванням регулярних виразів на PHP, і давайте розберемо цю тему докладніше.
Будь-яке регулярне вираз, яке складається з того, що надіслав користувач, завжди треба пропускати через функцію preg_quote (). Ця функція додає зворотний слеш перед кожним службовим символом, наприклад, перед символом "*".
Відео: Регулярні вирази для новачків і не тільки [GeekBrains]
Навіщо це потрібно? Давайте розглянемо такий приклад:
lt ;?php
$ str ="Abc * abc"-// Цей рядок прийшла від користувача, наприклад, методом POST
preg_match("/ $ Str /", $ text) -// Пошук відповідності в якійсь змінної $ text
?gt;
Але ж наша мета була просто отримати рядок від користувача без всяких спецсимволов (а "*"- це спецсимвол, відповідний будь-якому символу). А сам користувач хотів, щоб * була частиною тексту, а ніяк не спецсимволи. В результаті, регулярний вираз працює не так, як потрібно.
І дана проблема вирішується за допомогою функції preg_quote ():
lt ;?php
$ str ="Abc * abc"-// Цей рядок прийшла від користувача, наприклад, методом POST
$ str = preg_quote($ str) -// екрануючи службові символи
preg_match("/ $ Str /", $ text) -// Пошук відповідності в якійсь змінної $ text
?gt;
тепер "*"Буде замінена на" *", І ніяких проблем при пошуку соответсвия не виникне, так як тепер"*"- це не більше, ніж частина тексту, а не спецсимвол.
Ось на цьому етапі я не помилявся, і все зробив правильно, але я не врахував ще дещо:
lt ;?php
$ str ="Abc / abc"-// Цей рядок прийшла від користувача, наприклад, методом POST
$ str = preg_quote($ str) -// екрануючи службові символи
preg_match("/ $ Str /", $ text) -// Пошук відповідності в якійсь змінної $ text
?gt;
Після підстановки регулярний вираз стане таким: "/ Abc / abc /". Як Ви розумієте, воно не працюватиме, і PHP видасть помилку.
Ось цю-то помилку і виявив один з відвідувачів цього сайту. Вирішується вона дуже просто: всі прямі Слеш екрануються окремо. Якщо Ви використовуєте інший символ кордону регулярного виразу (наприклад, "#"), То треба екранувати його. Отже, ось правильний код:
lt ;?php
$ str ="Abc / abc"-// Цей рядок прийшла від користувача, наприклад, методом POST
$ str = preg_quote($ str) -// екрануючи службові символи
$ str = str_replace("/"," /", $ str) -// екрануючи прямий слеш
preg_match("/ $ Str /", $ text) -// Пошук відповідності в якійсь змінної $ text
?gt;
Ось і все вирішення проблеми. Давайте ще раз підведемо підсумок, що Ви повинні робити:
Відео: PHP РОБОТА формальному виразу. Поняття регулярного виразу
- Екранувати регулярний вираз за допомогою функції preg_quote ().
- Екранувати символ кордону регулярного виразу за допомогою функції str_replace ().
Після цього проблем з помилками регулярних виразів бути вже не повинно.
- Як убезпечити сайт
- Коли використовувати post, а коли get?
- Чому не відображається картинка на сайті?
- Як знайти помилку в jаvascript
- Команда findstr
- Використання rewritecond в mod_rewrite
- Функції для роботи з регулярними виразами в php
- Функція sscanf в php
- Реалізація пошуку на сайті через php
- Приклади регулярних виразів
- Основний інструмент при пошуку помилок в коді
- Чи не працює sql-запит
- Обробка форми в php
- Регулярні вирази
- Спецсимволи в регулярних виразів
- Квантіфікатори в регулярних виразів
- Російська мова та регулярні вирази в php
- Модифікатори в регулярних виразах
- Жадібні і ледачі квантіфікатори в регулярних виразах
- Метасимволи в регулярних виразів
- Сверхжадние або ревниві квантіфікатори в регулярних виразах