HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>В статье пойдет разговор о регулярных выражениях и функциях PHP<strong>regexp</strong>. Особое внимание будет уделено функции<strong>preg_replace</strong>, используемой для поиска по шаблону с последующей заменой на указанную строку.</p>
1 <p>В статье пойдет разговор о регулярных выражениях и функциях PHP<strong>regexp</strong>. Особое внимание будет уделено функции<strong>preg_replace</strong>, используемой для поиска по шаблону с последующей заменой на указанную строку.</p>
2 <p>PHP regexp (Regular Expressions) представляет собой алгоритм сопоставления шаблонов, причем это сопоставление можно выполнять в одном выражении. Для начала вспомним работу с командной строкой - к примеру,<strong>использование маски</strong>имен файлов, когда для удаления всех файлов в текущей директории, начинающихся на "d", системный администратор прописывает команду rm d* (многие делают это часто).</p>
2 <p>PHP regexp (Regular Expressions) представляет собой алгоритм сопоставления шаблонов, причем это сопоставление можно выполнять в одном выражении. Для начала вспомним работу с командной строкой - к примеру,<strong>использование маски</strong>имен файлов, когда для удаления всех файлов в текущей директории, начинающихся на "d", системный администратор прописывает команду rm d* (многие делают это часто).</p>
3 <p>Если вернуться к регулярным выражениям, то стоит сказать, что они представляют собой похожий<strong>инструмент для поиска и проверки строк на соответствие какому-нибудь шаблону</strong>. Но этот инструмент более мощный. Если сформулировать значение термина более простым языком, то регулярные выражения - это, по сути, специальный язык, предназначенный для описания шаблонов строк.</p>
3 <p>Если вернуться к регулярным выражениям, то стоит сказать, что они представляют собой похожий<strong>инструмент для поиска и проверки строк на соответствие какому-нибудь шаблону</strong>. Но этот инструмент более мощный. Если сформулировать значение термина более простым языком, то регулярные выражения - это, по сути, специальный язык, предназначенный для описания шаблонов строк.</p>
4 <p>В каких случаях применяются<strong>regexp</strong>: • для упрощения идентификации строковых данных посредством вызова одной функции - на выходе получается экономия времени при написании кода; • для проверки данных, введенных пользователем: email-адреса, домена сайта, номера телефона, IP-адреса; • для выделения ключевых слов в результатах поиска; • в целях идентификации тегов/замены тегов.</p>
4 <p>В каких случаях применяются<strong>regexp</strong>: • для упрощения идентификации строковых данных посредством вызова одной функции - на выходе получается экономия времени при написании кода; • для проверки данных, введенных пользователем: email-адреса, домена сайта, номера телефона, IP-адреса; • для выделения ключевых слов в результатах поиска; • в целях идентификации тегов/замены тегов.</p>
5 <p>В языке программирования PHP при работе с регулярными выражениями используют арифметические операторы (к примеру, +, -, ^), что позволяет создавать сложные выражения. Также PHP включает в себя встроенные функции preg, позволяющие работать с Regular Expression. Чаще всего используют: •<strong>preg_match</strong>- для сопоставления с шаблоном строки. Возвращает true, когда совпадение найдено, в обратном случае - false; •<strong>preg_split</strong>- для разбивки строки по шаблону с возвратом результата в виде числового массива; •<strong>preg_replace</strong>- если надо искать по шаблону с последующей заменой на указанную строку.</p>
5 <p>В языке программирования PHP при работе с регулярными выражениями используют арифметические операторы (к примеру, +, -, ^), что позволяет создавать сложные выражения. Также PHP включает в себя встроенные функции preg, позволяющие работать с Regular Expression. Чаще всего используют: •<strong>preg_match</strong>- для сопоставления с шаблоном строки. Возвращает true, когда совпадение найдено, в обратном случае - false; •<strong>preg_split</strong>- для разбивки строки по шаблону с возвратом результата в виде числового массива; •<strong>preg_replace</strong>- если надо искать по шаблону с последующей заменой на указанную строку.</p>
6 <h2>Функция preg_replace</h2>
6 <h2>Функция preg_replace</h2>
7 <p>Основные функции PHP (match, split и replace), предназначенные для работы с регулярками, мы уже перечислили. В этой статье рассмотрим особенности функционирования preg_replace: данная функция напоминает str_replace, - функцию для поиска и замены, только лишь в качестве первого параметра здесь принимается не просто строка, а регулярное выражение. Разница следующая:</p>
7 <p>Основные функции PHP (match, split и replace), предназначенные для работы с регулярками, мы уже перечислили. В этой статье рассмотрим особенности функционирования preg_replace: данная функция напоминает str_replace, - функцию для поиска и замены, только лишь в качестве первого параметра здесь принимается не просто строка, а регулярное выражение. Разница следующая:</p>
8 <p>Здесь нужно обратить внимание на решетки # - в них помещена буква "а" - их называют ограничителями используемых в коде регулярных выражений. После ограничителей пишутся модификаторы - команды, меняющие общие свойства регулярки. Тот же модификатор i заставит проигнорировать регистр символов:</p>
8 <p>Здесь нужно обратить внимание на решетки # - в них помещена буква "а" - их называют ограничителями используемых в коде регулярных выражений. После ограничителей пишутся модификаторы - команды, меняющие общие свойства регулярки. Тот же модификатор i заставит проигнорировать регистр символов:</p>
9 <h2>Буквы, цифры, символы</h2>
9 <h2>Буквы, цифры, символы</h2>
10 <p>В регулярных выражениях существуют два вида символов: обозначающие сами себя и символы, которые называют командами (спецсимволы).</p>
10 <p>В регулярных выражениях существуют два вида символов: обозначающие сами себя и символы, которые называют командами (спецсимволы).</p>
11 <p>Цифры и буквы обозначают сами себя, зато точка - спецсимвол, обозначающий "любой символ". Смотрим примеры:</p>
11 <p>Цифры и буквы обозначают сами себя, зато точка - спецсимвол, обозначающий "любой символ". Смотрим примеры:</p>
12 <p>По сути, в коде выше не существует разницы между функциями preg_replace и str_replace - функционируют они одинаково, разница заключается лишь в ограничителях.</p>
12 <p>По сути, в коде выше не существует разницы между функциями preg_replace и str_replace - функционируют они одинаково, разница заключается лишь в ограничителях.</p>
13 <p>В следующем примере можно увидеть, как использовался спецсимвол "точка" - такое уже нельзя сделать с помощью str_replace:</p>
13 <p>В следующем примере можно увидеть, как использовался спецсимвол "точка" - такое уже нельзя сделать с помощью str_replace:</p>
14 <p>Раз точка - любой символ, то под регулярку подпадут все подстроки, причем по следующему шаблону:<em>буква 'x', потом любой символ, потом снова 'x'</em>. Первые четыре подстроки попали под данный шаблон (xax xsx x&amp;x x-x), поэтому они заменились на '!'. Последняя подстрока (xaax) не подпала по той причине, что внутри (между буквами 'x') находится не один, а два символа.</p>
14 <p>Раз точка - любой символ, то под регулярку подпадут все подстроки, причем по следующему шаблону:<em>буква 'x', потом любой символ, потом снова 'x'</em>. Первые четыре подстроки попали под данный шаблон (xax xsx x&amp;x x-x), поэтому они заменились на '!'. Последняя подстрока (xaax) не подпала по той причине, что внутри (между буквами 'x') находится не один, а два символа.</p>
15 <p>Раз точка - любой символ, а в регулярке мы видим 2 точки подряд, то под регулярку подпадут все подстроки по следующему шаблону:<em>буква 'x', потом 2 любых символа, потом снова 'x'</em>. Первая подстрока не подпадет, т. к. она содержит лишь один символ между буквами 'x', в то время как последняя подстрока (xabx) шаблону соответствует.</p>
15 <p>Раз точка - любой символ, а в регулярке мы видим 2 точки подряд, то под регулярку подпадут все подстроки по следующему шаблону:<em>буква 'x', потом 2 любых символа, потом снова 'x'</em>. Первая подстрока не подпадет, т. к. она содержит лишь один символ между буквами 'x', в то время как последняя подстрока (xabx) шаблону соответствует.</p>
16 <p>Что тут важно запомнить:<strong>цифры и буквы обозначают сами себя, точка же заменяет любой символ</strong>. Также важно следующее: для функции preg_match точка на деле обозначает любой символ за исключением перевода строки. Дабы точка обозначала и его,<a>необходим модификатор s</a>.</p>
16 <p>Что тут важно запомнить:<strong>цифры и буквы обозначают сами себя, точка же заменяет любой символ</strong>. Также важно следующее: для функции preg_match точка на деле обозначает любой символ за исключением перевода строки. Дабы точка обозначала и его,<a>необходим модификатор s</a>.</p>
17 <h2>Операторы повторения</h2>
17 <h2>Операторы повторения</h2>
18 <p>Иногда мы хотим указать, что какой-нибудь символ повторяется определенное число раз. Когда мы знаем это число точно, то просто пишем ('#aaaa#'). Но как поступить, если мы желаем повторить один либо больше раз?</p>
18 <p>Иногда мы хотим указать, что какой-нибудь символ повторяется определенное число раз. Когда мы знаем это число точно, то просто пишем ('#aaaa#'). Но как поступить, если мы желаем повторить один либо больше раз?</p>
19 <p>Вопрос решается с помощью операторов повторения (квантификаторов): плюс '+' (один и больше раз), потом звездочка '*' (ноль и больше раз), а затем вопрос '?' (ноль либо один раз, то есть может быть, а может и не быть).</p>
19 <p>Вопрос решается с помощью операторов повторения (квантификаторов): плюс '+' (один и больше раз), потом звездочка '*' (ноль и больше раз), а затем вопрос '?' (ноль либо один раз, то есть может быть, а может и не быть).</p>
20 <p>Эти операторы действуют на символ, который непосредственно стоит перед ними.</p>
20 <p>Эти операторы действуют на символ, который непосредственно стоит перед ними.</p>
21 <p>Для наилучшего понимания стоит рассмотреть пример:</p>
21 <p>Для наилучшего понимания стоит рассмотреть пример:</p>
22 <p>В коде выше шаблон поиска выглядит следующим образом:<em>буква 'x', потом 'a' один либо больше раз, потом 'x'</em>.</p>
22 <p>В коде выше шаблон поиска выглядит следующим образом:<em>буква 'x', потом 'a' один либо больше раз, потом 'x'</em>.</p>
23 <p>В этом случае шаблон поиска будет выглядеть следующим образом:<em>буква 'x', буква 'a' ноль либо больше раз, буква 'x'</em>. То есть буквы 'a' либо нет, либо она повторяется один и больше раз.</p>
23 <p>В этом случае шаблон поиска будет выглядеть следующим образом:<em>буква 'x', буква 'a' ноль либо больше раз, буква 'x'</em>. То есть буквы 'a' либо нет, либо она повторяется один и больше раз.</p>
24 <p>Кроме самого очевидного варианта<em>xax xaax xaaax</em>, также подпадает подстрока 'xx', ведь там не существует буквы 'a' вообще (то есть ноль раз).</p>
24 <p>Кроме самого очевидного варианта<em>xax xaax xaaax</em>, также подпадает подстрока 'xx', ведь там не существует буквы 'a' вообще (то есть ноль раз).</p>
25 <p>Также под шаблон не подпал и 'xbx'. Это связано с тем, что отсутствует 'a', однако есть 'b' (ее не разрешали).</p>
25 <p>Также под шаблон не подпал и 'xbx'. Это связано с тем, что отсутствует 'a', однако есть 'b' (ее не разрешали).</p>
26 <p>Здесь шаблон поиска выглядит следующим образом: буква 'x', далее 'a' может быть либо не быть, далее 'x'.</p>
26 <p>Здесь шаблон поиска выглядит следующим образом: буква 'x', далее 'a' может быть либо не быть, далее 'x'.</p>
27 <h2>Группирующие скобки</h2>
27 <h2>Группирующие скобки</h2>
28 <p>В примерах, которые были рассмотрены выше, операторы повторения воздействовали лишь на один символ, стоявший перед ними. Но иногда надо задействовать сразу несколько символов - в таких ситуациях пригодятся группирующие скобки '(' и ')':</p>
28 <p>В примерах, которые были рассмотрены выше, операторы повторения воздействовали лишь на один символ, стоявший перед ними. Но иногда надо задействовать сразу несколько символов - в таких ситуациях пригодятся группирующие скобки '(' и ')':</p>
29 <p>Здесь шаблон поиска выглядит следующим образом:<em>буква 'x', потом строка 'ab' один либо больше раз, потом 'x'</em>.</p>
29 <p>Здесь шаблон поиска выглядит следующим образом:<em>буква 'x', потом строка 'ab' один либо больше раз, потом 'x'</em>.</p>
30 <p>Если что-либо стоит в группирующих скобках, а сразу после закрывающей скобки находится оператор повторения, этот оператор подействует на все, что расположено внутри скобок.</p>
30 <p>Если что-либо стоит в группирующих скобках, а сразу после закрывающей скобки находится оператор повторения, этот оператор подействует на все, что расположено внутри скобок.</p>
31 <h2>Экранируем спецсимволы</h2>
31 <h2>Экранируем спецсимволы</h2>
32 <p>Иногда надо сделать так, чтобы спецсимвол обозначал себя сам. К примеру, чтобы найти по следующему шаблону:<em>'a', потом плюс '+', потом 'x'</em>. Код ниже будет функционировать не совсем так, как хочется:</p>
32 <p>Иногда надо сделать так, чтобы спецсимвол обозначал себя сам. К примеру, чтобы найти по следующему шаблону:<em>'a', потом плюс '+', потом 'x'</em>. Код ниже будет функционировать не совсем так, как хочется:</p>
33 &lt;?php echo preg_replace('#a+x#', '!', 'a+x ax aax aaax'); //выведет 'a+x ! ! !'' ?&gt;<p>Тут разработчик планировал, чтобы шаблон поиска выглядел следующим образом:<em>буква 'a', потом плюс '+', потом 'x'</em>. На деле он выглядит иначе:<em>буква 'a' один либо больше раз, потом 'x'</em>. Именно поэтому подстрока 'a+x' не подпала под шаблон (так как мешает '+'), а все остальные подпали.</p>
33 &lt;?php echo preg_replace('#a+x#', '!', 'a+x ax aax aaax'); //выведет 'a+x ! ! !'' ?&gt;<p>Тут разработчик планировал, чтобы шаблон поиска выглядел следующим образом:<em>буква 'a', потом плюс '+', потом 'x'</em>. На деле он выглядит иначе:<em>буква 'a' один либо больше раз, потом 'x'</em>. Именно поэтому подстрока 'a+x' не подпала под шаблон (так как мешает '+'), а все остальные подпали.</p>
34 <p>Здесь важно запомнить следующее:<strong>чтобы спецсимвол обозначал себя сам, его надо экранировать посредством обратного слеша</strong>. Вот, каким образом это можно реализовать:</p>
34 <p>Здесь важно запомнить следующее:<strong>чтобы спецсимвол обозначал себя сам, его надо экранировать посредством обратного слеша</strong>. Вот, каким образом это можно реализовать:</p>
35 <p>Теперь наш шаблон поиска выглядит нужным образом:<em>буква 'a', потом плюс '+', потом 'x'</em>.</p>
35 <p>Теперь наш шаблон поиска выглядит нужным образом:<em>буква 'a', потом плюс '+', потом 'x'</em>.</p>
36 <p>В примере выше шаблон выглядит следующим образом:<em>'a', далее точка '.', далее 'x'</em>. Сравним с примером ниже (тут забыт обратный слэш):</p>
36 <p>В примере выше шаблон выглядит следующим образом:<em>'a', далее точка '.', далее 'x'</em>. Сравним с примером ниже (тут забыт обратный слэш):</p>
37 <p>В результате все подстроки попали под шаблон, ведь неэкранированная точка обозначает, по сути, любой символ.</p>
37 <p>В результате все подстроки попали под шаблон, ведь неэкранированная точка обозначает, по сути, любой символ.</p>
38 <p>Следует обратить внимание вот на что: если забудете обратный слэш для точки (в случае, когда она должна сама себя обозначать), это можно даже и не заметить:</p>
38 <p>Следует обратить внимание вот на что: если забудете обратный слэш для точки (в случае, когда она должна сама себя обозначать), это можно даже и не заметить:</p>
39 <p>Да, визуально все работает правильно, но т. к. точка обозначает любой символ, включая обычную точку '.'. Однако если строку, где происходят замены, поменять, ошибка станет заметна:</p>
39 <p>Да, визуально все работает правильно, но т. к. точка обозначает любой символ, включая обычную точку '.'. Однако если строку, где происходят замены, поменять, ошибка станет заметна:</p>
40 <p>Вывод прост: следует быть предельно внимательным!</p>
40 <p>Вывод прост: следует быть предельно внимательным!</p>
41 <h2>Ограничители</h2>
41 <h2>Ограничители</h2>
42 <p>В роли ограничителей способны выступать не только # - для этого существуют и другие символы (буквы и цифры не в счет). Когда применяются скобки, левый ограничитель одновременно является открывающей скобкой, в то время как правый - закрывающей:</p>
42 <p>В роли ограничителей способны выступать не только # - для этого существуют и другие символы (буквы и цифры не в счет). Когда применяются скобки, левый ограничитель одновременно является открывающей скобкой, в то время как правый - закрывающей:</p>
43 <p>Когда символ не специальный, то при использовании его в роли ограничителя, его следует экранировать непосредственно в самой регулярке (станет специальным):</p>
43 <p>Когда символ не специальный, то при использовании его в роли ограничителя, его следует экранировать непосредственно в самой регулярке (станет специальным):</p>
44 <h2>Перечень обычных и спецсимволов</h2>
44 <h2>Перечень обычных и спецсимволов</h2>
45 <p>При экранировании обычного символа ничего особенного не случится, и он все равно будет обозначать себя сам. Исключениями являются цифры, которые<a>станут карманами</a>. Также исключением будет модификатор 'X': когда он установлен, экранировка обычных символов<a>вызывает ошибку</a>.</p>
45 <p>При экранировании обычного символа ничего особенного не случится, и он все равно будет обозначать себя сам. Исключениями являются цифры, которые<a>станут карманами</a>. Также исключением будет модификатор 'X': когда он установлен, экранировка обычных символов<a>вызывает ошибку</a>.</p>
46 <p>Порой появляются сомнения, а является ли символ специальным. Иногда разработчики даже экранируют подряд все подозрительные символы, но это плохая практика, ведь происходит захламление регулярки обратными слэшами.</p>
46 <p>Порой появляются сомнения, а является ли символ специальным. Иногда разработчики даже экранируют подряд все подозрительные символы, но это плохая практика, ведь происходит захламление регулярки обратными слэшами.</p>
47 <ul><li>Что является спецсимволами:<strong>$ ^ . * + ? \ {} [] () |</strong></li>
47 <ul><li>Что является спецсимволами:<strong>$ ^ . * + ? \ {} [] () |</strong></li>
48 <li>А что не является:<strong>@ : , ' '' ; - _ = &lt; &gt; % # ~ `&amp; ! /</strong></li>
48 <li>А что не является:<strong>@ : , ' '' ; - _ = &lt; &gt; % # ~ `&amp; ! /</strong></li>
49 <li>Также спецсимволами будут<strong>выбранные ограничители</strong>.</li>
49 <li>Также спецсимволами будут<strong>выбранные ограничители</strong>.</li>
50 </ul><p>Вдобавок к этому, # будет спецсимволом в случае наличия модификатора 'x' (речь идет именно про маленький 'x', разрешающий комментарии).</p>
50 </ul><p>Вдобавок к этому, # будет спецсимволом в случае наличия модификатора 'x' (речь идет именно про маленький 'x', разрешающий комментарии).</p>
51 <h2>Об ограничении "жадности"</h2>
51 <h2>Об ограничении "жадности"</h2>
52 <p>Для понимания, о чем идет речь, лучше сначала ознакомиться с примером:</p>
52 <p>Для понимания, о чем идет речь, лучше сначала ознакомиться с примером:</p>
53 <p>Здесь шаблон поиска выглядит следующим образом:<em>'a', любой символ один и больше раз, 'x'</em>. Но выражение сработало не так, как ожидал разработчик: было захвачено максимально возможное число символов, т. е. закончилась не на первом 'x', а на последнем.</p>
53 <p>Здесь шаблон поиска выглядит следующим образом:<em>'a', любой символ один и больше раз, 'x'</em>. Но выражение сработало не так, как ожидал разработчик: было захвачено максимально возможное число символов, т. е. закончилась не на первом 'x', а на последнем.</p>
54 <p>Данное поведение операторов повторения называют<strong>жадностью</strong>, т. к. они стремятся забрать как можно больше. Это особенность полезна, но не всегда, поэтому ее можно отменить, ограничив жадность. Для этого надо добавить к оператору повторения знак '?': вместо жадных '+' и '<em>' следует написать '+?' и '</em>?', что ограничит эту самую жадность:</p>
54 <p>Данное поведение операторов повторения называют<strong>жадностью</strong>, т. к. они стремятся забрать как можно больше. Это особенность полезна, но не всегда, поэтому ее можно отменить, ограничив жадность. Для этого надо добавить к оператору повторения знак '?': вместо жадных '+' и '<em>' следует написать '+?' и '</em>?', что ограничит эту самую жадность:</p>
55 <p>В примере выше шаблон поиска выглядит так:<em>'a', потом любой символ один либо больше раз (с ограничением жадности) и 'x'</em>.</p>
55 <p>В примере выше шаблон поиска выглядит так:<em>'a', потом любой символ один либо больше раз (с ограничением жадности) и 'x'</em>.</p>
56 <p>Посредством '?' была ограничена жадность плюсу, поэтому теперь поиск осуществляется до первого совпадения.</p>
56 <p>Посредством '?' была ограничена жадность плюсу, поэтому теперь поиск осуществляется до первого совпадения.</p>
57 <p>Жадность можно ограничивать для всех операторов повторения, включая '?', '{}' - выглядеть это будет так: '??' и '{}?'.</p>
57 <p>Жадность можно ограничивать для всех операторов повторения, включая '?', '{}' - выглядеть это будет так: '??' и '{}?'.</p>
58 <p><em>Ссылки на источники:</em>• https://www.internet-technologies.ru/articles/regulyarnye-vyrazheniya-php.html; • http://old.code.mu/books/php/regular/rabota-s-regulyarnymi-vyrazeniyami-v-php-glava-1.html.</p>
58 <p><em>Ссылки на источники:</em>• https://www.internet-technologies.ru/articles/regulyarnye-vyrazheniya-php.html; • http://old.code.mu/books/php/regular/rabota-s-regulyarnymi-vyrazeniyami-v-php-glava-1.html.</p>
59  
59