Екранування регулярного виразу в php

Екранування регулярного виразу в 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 РОБОТА формальному виразу. Поняття регулярного виразу

  1. Екранувати регулярний вираз за допомогою функції preg_quote ().
  2. Екранувати символ кордону регулярного виразу за допомогою функції str_replace ().

Після цього проблем з помилками регулярних виразів бути вже не повинно.

Поділися в соціальних мережах:

Схожі
Метасимволи в регулярних виразівМетасимволи в регулярних виразів
Квантіфікатори в регулярних виразівКвантіфікатори в регулярних виразів
Регулярні виразиРегулярні вирази
Реалізація пошуку на сайті через phpРеалізація пошуку на сайті через php
Сверхжадние або ревниві квантіфікатори в регулярних виразахСверхжадние або ревниві квантіфікатори в регулярних виразах
Модифікатори в регулярних виразахМодифікатори в регулярних виразах
Регулярні вирази linuxРегулярні вирази linux
Функції для роботи з регулярними виразами в phpФункції для роботи з регулярними виразами в php
Російська мова та регулярні вирази в phpРосійська мова та регулярні вирази в php
Команда findstrКоманда findstr
» » Екранування регулярного виразу в php