<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

После прохождения курса Вы без труда сможете создавать любые сайты с использованием фреймворка Yii, причём делать это будете быстро и качественно.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Экранирование регулярного выражения в PHP

Экранирование регулярного выражения в PHP

Не так давно один из участников моего форума обнаружил ошибку у меня на сайте. Если ввести "/" в форму поиска, то выдавалась ошибка. Вроде бы ничего серьёзного, но это не очень хорошо. Поэтому эту ошибку я сразу нашёл и исправил. А ошибка была в том, что я кое-что забыл учесть. Это немного связано с экранированием регулярных выражений на PHP, и давайте разберём эту тему подробнее.

Любое регулярное выражение, которое составляется из того, что прислал пользователь, всегда надо пропускать через функцию preg_quote(). Данная функция добавляет обратный слэш перед каждым служебным символом, например, перед символом "*".

Зачем это нужно? Давайте рассмотрим такой пример:

<?php
  $str = "abc * abc"; // Эта строка пришла от пользователя, например, методом POST
  preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

Но ведь наша цель была просто получить строку от пользователя без всяких спецсимволов (а "*" - это спецсимвол, соответствующий любому символу). А сам пользователь хотел, чтобы * была частью текста, а никак не спецсимволом. В результате, регулярное выражение работает не так, как требуется.

И данная проблема решается с помощью функции preg_quote():

<?php
  $str = "abc * abc"; // Эта строка пришла от пользователя, например, методом POST
  $str = preg_quote($str); // Экранируем служебные символы
  preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

Теперь "*" будет заменена на "\*", и никаких проблем при поиске соответсвия не возникнет, так как теперь "*" - это не более, чем часть текста, а не спецсимвол.

Вот на этом этапе я не ошибался, и всё сделал правильно, но я не учёл ещё кое-что:

<?php
  $str = "abc / abc"; // Эта строка пришла от пользователя, например, методом POST
  $str = preg_quote($str); // Экранируем служебные символы
  preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

После подстановки регулярное выражение станет таким: "/abc / abc/". Как Вы понимаете, оно работать не будет, и PHP выдаст ошибку.

Вот эту-то ошибку и обнаружил один из посетителей данного сайта. Решается она очень просто: все прямые слэши экранируются отдельно. Если Вы используете другой символ границы регулярного выражения (например, "#"), то надо экранировать его. Итак, вот правильный код:

<?php
  $str = "abc / abc"; // Эта строка пришла от пользователя, например, методом POST
  $str = preg_quote($str); // Экранируем служебные символы
  $str = str_replace("/", "\/", $str); // Экранируем прямой слэш
  preg_match("/$str/", $text); // Поиск соответствия в некой переменной $text
?>

Вот и всё решение проблемы. Давайте ещё раз подведём итог, что Вы должны делать:

  1. Экранировать регулярное выражение с помощью функции preg_quote().
  2. Экранировать символ границы регулярного выражения с помощью функции str_replace().

После этого проблем с ошибками регулярных выражений быть уже не должно.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (10):

cyber93 cyber93 08.12.2012 01:48:18

Спасибо за фун-цию. Михаил, подскажите. Я добавляю в DOM новый элемент с помощью метода append(jquery), но скрипты для нового элемента уже не будут работать. Как с этим справится ? Задача вставить в таблицу новый товар, сразу после добавления и чтобы все события для нового элемента работали. Помогите пожалуйста.

Ответить

Admin Admin 08.12.2012 10:38:44

Всё должно работать, если добавив новый элемент Вы поставите ему все необходимые обработчики событий.

Ответить

cyber93 cyber93 08.12.2012 11:31:52

Нет, после добавления нового элемента, создавать заново обработчики не вариант, там оч много событий. У меня таблица товаров в админ панели, при клике на поле таблицы, появляется поле для редактирования товара, при клике на строку таблицы строка выделяться и можно удалить выделенные товары. В общем там много событий. Но если добавить в таблицу новый товар с помощью append, то все события для нового элемента уже не работают.

Ответить

Admin Admin 08.12.2012 13:10:45

Не создать новые обработчики, а просто добавить соответствующие атрибуты во все вставляемые элементы. То есть не просто новый <div></div>, а <div onclick="func()"></div>

Ответить

cyber93 cyber93 08.12.2012 13:58:39

Не, тоже не вариант. решение уже нашел. В общем у метода on() существует два способа обработки события. 1. Прямой 2. Делегированный. Прямой вот так: $('#items-back tbody tr').on('событие', function() {}). А делегированный вот так: $('#items-back tbody').on('click', 'tr', function() {}). Михаил добавте в коментарии форматирование текста, какой-то плагин на подобии tinymce.

Ответить

cyber93 cyber93 08.12.2012 13:59:21

А вот хорошая статья, может пригодится. http://jquery.page2page.ru/index.php5/On

Ответить

Dante Dante 08.12.2012 17:38:14

Ну к примеру если вам необходимо добавить к новому(только что созданному) элементу что либо, обратитесь к нему используя live, к примеру: $("#new_element").live("click", function(){ $(this).after("<p>=)</p>"); });

Ответить

cyber93 cyber93 08.12.2012 18:34:00

live не поддерживает submit, а у меня событие именно submit. К тому же live устарел и в новых версиях его совсем уберут. Обработчик событий .on()для того и создан чтобы объединить три метода .bind(), .delegate(), .live()

Ответить

soffrick soffrick 20.07.2013 11:12:40

$str = preg_quote($str); // Экранируем служебные символы $str = str_replace("/", "\/", $str); // Экранируем прямой слэш

Ответить

soffrick soffrick 20.07.2013 11:13:14

достаточно передать слеш вторым параметром в preg_quote

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.