Регулярные выражения в PHP часть 1 (preg_replace)

Регулярные выражения в PHP - это мощный инструмент, который в умелых руках может творить чудеса. Знание регулярных выражений не слишком важно для создания сайтов, потому что они довольно редко встречаются в проектах. Но некоторые особо важные функции просто невозможно сделать без них. Поэтому стоит хотя бы ознакомиться с темой.
Пользуйтесь регулярными выражениями только в том случае, если нет никакого другого способа решения задачи.

Типичная жизненная ситуация:
У программиста была одна проблема. Он решил эту проблему с помощью регулярного выражения. Теперь у программиста есть две проблемы!
Регулярные выражения лучше всего начать изучать с функции preg_replace. Эта функция очень похожа по своей функции на str_replace, которая заменяет часть строки на другую строку. Только на первым параметром функции preg_replace является регулярное выражение. Попробуем сравнить их простейшее использование
<?php 
   echo str_replace('ш', 'Ш', 'Тише, мыши, кот на крыше');
   echo preg_replace('#ш#iu', 'Ш', 'Тише, мыши, кот на крыше');
?>
Символы решётки в примере "#...#" называют ограничителями регулярных выражений. После ограничителя идут модификаторы "iu", которые изменяют поведение функции preg_replace. В нашем случае:
  • "i" означает отключение чувствительности к регистру искомого символа
  • "u" означает, что нужно включить в функции preg_replace поддержку UTF-8 кодировки. Иначе кириллица будет обрабатываться неправильно
Теперь запустим код и проверим результат. Получатся две одинаковых строки:
ТиШе, мыШи, кот на крыШе
ТиШе, мыШи, кот на крыШе
Но сила регулярных выражений в том, что в искомой строке можно задавать символы-команды. Приведём пример: буквы и цифры внутри регулярного выражения будут искаться и заменяться как есть, но символ точки "." буде восприниматься как любой символ. То есть:
<?php 
   echo preg_replace('#м.ш.#iu', 'МЫШИ', 'Тише, мыши, кот на крыше');
   echo preg_replace('#к...е#iu', 'сыре', 'Тише, мыши, кот на крыше');
?>
Получим результат:
Тише, МЫШИ, кот на крыше
Тише, мыши, кот на сыре

Операторы повторения

Бывают ситуации, когда в регулярном выражении необходимо указать на повторяющийся символ. Чтобы не писать этот символ несколько раз, можно использовать один из операторов повторения:
  • + - символ повторяется один или более раз
  • * - символ повторяется ноль или более раз
  • ? - символ повторяется ноль или один раз. То есть может присутствовать или нет
Эти операторы ставятся после символа, который повторяется. Можно ставить эти операторы и после символ-команд, к примеру, точки ".", которая обозначает любой символ.Приведём примеры их использования:
<?php 
   echo preg_replace('#Т.+и#iu', 'Осторожно', 'Тише, мыши, кот на крыше');
?>
В результате выполнения такого кода получим:
Осторожно, кот на крыше

Ограничение жадности

Регулярное выражение захватывает максимально возможное количество символов. Поэтому результат может быть неожиданным. К примеру. предположим, что нам надо заменить в строке "Тише, мыши, кот на крыше" слово "Тише" на "Громче". Для этого используем выражение:
<?php 
   echo preg_replace('#Т.+е#u', 'Громче', 'Тише, мыши, кот на крыше');
?>
Может показаться, что выражение сработает правильно. Но по факту оно найдёт букву "Т" в начале строки и букву "е" не в конце первого слова, а в конце всей строки. Результат получится такой:
Громче
Чтобы этого не происходило, необходимо ограничить жадность регулярного выражения. Для этого необходимо после оператора повторения (звёздочки "*" или плюса "+") поставить знак вопроса "?", чтобы они перестали быть такими жадными.
<?php 
   echo preg_replace('#Т.+?е#u', 'Громче', 'Тише, мыши, кот на крыше');
?>
Теперь результат будет такой, какой мы ожидали ранее:
Громче, мыши, кот на крыше
Ограничивать жадность можно всем оператором повторения. В том числе самому "?", делая так: "??".

Группирующие круглые скобки

Как было сказано ранее, операторы повторения работают только на символ, который стоит до них. Если же необходимо применить оператор повторения на несколько символов, то необходимо поставить скобки. Приведём пример:
<?php 
   echo preg_replace('#(ыш)+#iu', '!', 'Тише, мыши, кот на крыше');
?>
Из кода видно, что оператор повторения будет применяться к двум символам, стоящим в круглых скобках - (ыш). Результат выполнения такого кода:
Тише, м!и, кот на кр!е

Квадратные скобки

Существуют квадратные скобки. Если круглые являются "группирующими", или в терминах логики они делают соединение "и", то квадратные скобки - это логическое "или". Приведём пример:
<?php 
   echo preg_replace('#[ншр]+#u', '!', 'Тише, мыши, кот на крыше');
?>
В результате выполнения этого кода все буквы "н", "ш", "р", которые стоят в квадратных скобках [ншр] будут заменены на восклицательный знак "!".
Ти!е, мы!и, кот !а к!ы!е
Существует ещё возможность сделать отрицание в квадратных скобках. Тогда будут заменены все символы, которые в них не попали. Это делается с помощью значка возведения в степень "^":
<?php 
   echo preg_replace('#[^ншр]+#u', '!', 'Тише, мыши, кот на крыше');
?>
Результат такой:
!ш!ш!н!р!ш!
В квадратных скобках можно задавать не только символы отдельно, но и целые диапазоны:
  • [а-я] - все строчные буквы
  • [а-д] - строчные буквы от "а" до "д": а, б, в, г, д
  • [а-яА-Я] - все строчные и заглавные буквы
  • [0-9] - все цифры
  • [4-7] - цифры: 4, 5, 6, 7
Есть другой способ сделать логику "или". Для этого существует символ вертикальной черты |. Попробуем использовать его:
<?php 
   echo preg_replace('#н|ш|р#u', '!', 'Тише, мыши, кот на крыше');
?>
Результат будет такой:
Ти!е, мы!и, кот !а к!ы!е

Экранировка спецсимволов

Бывают ситуации, когда в регулярном выражении необходимо использовать спецсимвол.
Спецсимволы:
$ ^ . * + ? \ { } [ ] ( ) |

Не являются спецсимволами:
@ : , ' " ; - _ = < > % # ~ `& ! /
К примеру, необходимо заменить все знаки "+" в строке. Но в регулярном выражении "+" является оператором повторения. Чтобы снять с него все функции и сделать простым символом, как буквы или цифры, необходимо поставить перед ним знак падающего слеша "\", чтобы получилось "\+":
<?php 
   echo preg_replace('#\+#', 'плюс', 'Один + один');
?>
В таком случае говорят, что знак "+" экранирован, поэтому не воспринимается как спецсимвол. Результат будет таким:
Один плюс один

Ограничители

По бокам регулярного выражения мы ставили ограничители "#". Но ограничителем может быть не только символ решётки, но и другие спецсимволы. К примеру: "/", "&" и даже скобки "(" ... ")". Всё зависит от того, что мы хотим использовать внутри выражения. Если будет использована решётка, то внутри её придётся экранировать. Но если поставить ограничители "&", то решётку внутри них не придётся экранировать:
<?php 
   echo preg_replace('&#&', 'мыши', 'Тише, #, кот на крыше'); 
      // нет нужды экранировать

   echo preg_replace('#\##', 'мыши', 'Тише, #, кот на крыше'); 
      // придётся экранировать "\#"
?>
В этом примере будет результат из двух одинаковых строк:
Тише, мыши, кот на крыше
Тише, мыши, кот на крыше
Читайте продолжение статьи тут: "Регулярные выражения в PHP (preg_replace) часть 2"
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, покупка SSL сертификатов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Была ли эта статья полезна? Есть вопрос?
Cмотрите другие статьи: