PHP (регулярное выражение) - что это такое? Примеры и проверка регулярных выражений. PHP regexp: примеры регулярных выражений Php регулярные выражения символы градуса

PHP (регулярное выражение) - что это такое? Примеры и проверка регулярных выражений. PHP regexp: примеры регулярных выражений Php регулярные выражения символы градуса

В данной статье предоставлена подборка php regexp примеров. Очень хорошая и полезная коллекция примеров регулярных выражений (regular expressions). Все примеры регулярных выражений приемлемы для PHP. Пользуйтесь на здоровье!

Пример проверки доменного имени

Данный, php сниппет проверяет, является ли строка допустимым доменным именем.

?:.*)+):?(d+)?/?/i", $url)) { echo "Your url is ok."; } else { echo "Wrong url."; }

Пример подсветки слова в тексте

Очень полезное регулярное выражение, для поиска и подсветки нужного слова в тексте. Особенно код полезен, при создании вывода результатов поиска.

$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor"; $text = preg_replace("/b(regex)b/i", "1", $text); echo $text;

Пример реализации подсветки результатов поиска у WordPress

Откройте файл search.php и найдите функцию the_title(). Замените ее следующей строкой:

Echo $title;

А теперь, перед замененной строкой вставьте этот код:

\0", $title); ?>

Сохраните ваш файл search.php и откройте style.css. Добавьте в него следующую строку:

Strong.search-excerpt { background: yellow; }

Пример получения изображений из HTML методом regexp

Данный кусок php кода использующий регулярные выражения, ищет все изображения и адрес url к ним.

$images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) { $info = pathinfo($url); if (isset($info["extension"])) { if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($images, $url); } }

Удаление повторяющихся слов (без учета регистра)

Часто встречаются слова, которые повторяются? Тогда пример этого регулярного выражения будет вам полезным.

$text = preg_replace("/s(w+s)1/i", "$1", $text);

Удаление повторяющихся точек

То же самое, только с повторяющимися точками.

$text = preg_replace("/.+/i", ".", $text);

Соответствие XML / HTML тегов

Эта простая функция принимает два аргумента: тег (соответствия которому вы хотите найти), xmlили html код.

Function get_tag($tag, $xml) { $tag = preg_quote($tag); preg_match_all("{<".$tag."[^>]*>(.*?)."}", $xml, $matches, PREG_PATTERN_ORDER); return $matches; }

Поиск XHTML/XML тегов с определенными значениями атрибутов

Этот пример похож на предыдущую функцию, только вы можете значительно расширить поиск например найти

.

Function get_tag($attr, $value, $xml, $tag=null) { if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; }

Поиск шестнадцатеричных значений цвета

Отличный пример регулярного выражения, который ищет соответствия шестнадцатеричных значений цвета в заданных строках. Для чего это? Может быть, вы хотите написать сервис по сжатию CSS кода, или что-то подобное.

$string = "#555555"; if (preg_match("/^#(?:(?:{3}){1,2})$/i", $string)) { echo "example 6 successful."; }

Пример поиска title на заданной странице

Этот интересный пример PHP кода с regexp ищет и возвращает текст между тегами и .

Feof($fp)){ $page .= fgets($fp, 4096); } $titre = eregi("(.*)",$page,$regs); echo $regs; fclose($fp);

Парсинг лога Apache

Большинство сайтов работают на известных серверах Apache. Если ваш сайт также работает на нем, то можно сделать парсинг лога сервера с помощью php regexp.

//Logs: Apache web server //Successful hits to HTML files only. Useful for counting the number of page views. "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$" //Logs: Apache web server //404 errors only "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$"

Пример проверки сложности пароля

Отличный пример регулярного выражения, которое проверяет уровень сложности пароля. Пароль должен состоять из 6 символов, содержать хотя бы: один заглавный символ, строчный символ, цифру.

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)[-_a-zA-Z0-9]{6,}z"

Замена текстовых смайликов на графические смайлики

Данный пример кода будет менять текстовый смайлик, на ваш графический. Интересный и полезный php сниппет.

$texte="A text with a smiley:-)"; echo str_replace(":-)","",$texte);

Пример регулярного выражения для получения изображений из html кода

Стоит сказать, что данный php код используется в wordpress, для поиска и обработки изображений.

post_content; $szSearchPattern = "~]* />~"; // Run preg_match_all to grab all the images and save the results in $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Check to see if we have at least 1 image $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) { // Здесь вы можете обрабатывать ваши изображения // В данном примере они просто выведутся на монитор for ($i=0; $i < $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Надеюсь, вам была полезна подборка примеров php regexp. Если есть интересные дополнения или примеры регулярных выражений (php), пишите в комментариях.

Регулярные выражения (сокращенно — regex ) представляют собой последовательности символов, которые формируют шаблоны поиска. В основном они используются в шаблонах сопоставления со строками.

Краткая история

  • Все началось в 1940 — 1960-х годах, когда множество умных людей говорили о регулярных выражениях;
  • 1970-е годы g / re / p;
  • 1980 Perl и Генри Спенсер;
  • 1997 PCRE (регулярные выражения, совместимые с Perl). Именно тогда начался взлет того, что мы называем регулярные выражения. PCRE предоставляет библиотеки почти для каждого языка.

Общее использование регулярных выражений в PHP

PHP включает в себя три основные функции для работы с PCRE — preg_match , preg_match_all и preg_replace .

Сравнение соответствия

Выражение возвращает 1 , если соответствие установлено, 0 — если нет, и false — если возникает ошибка:

int preg_match (string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

Регулярного выражения пример, который возвращает количество найденных совпадений:

int preg_match_all (string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Замена

Выражение возвращает замененную строку или массив (на основе объекта $subject ):

mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])

Общее использование регулярных выражений в JavaScript

Регулярные выражения в JavaScript выглядят почти так же, как и в PHP .

Сравнение соответствия

Возвращает массив совпадений или null , если совпадений не найдено:

string.match(RegExp);

Замена

Регулярное выражение, которое возвращает строку с выполненными заменами:

string.replace(RegExp, replacement);

Особенности регулярных выражений в JavaScript

  • Точка никогда не соответствует новой строке:
  • Те же методы для сравнения соответствия и замены через регулярное выражение, что и без них.

Принципы составления шаблонов регулярных выражений

Рассмотрим пример, в котором нужно найти адреса электронной почты в базе кода. Наша цель:

Аналоговые сокеты

Регулярные выражения состоят из двух типов символов:

  • специальные символы: ? * + {} () ^ $ / .
  • Литералы.

Представьте себе входные строки как болты, а шаблон — как набор разъемов для них (в соответствующем порядке).

Специальные символы

При проверке регулярных выражений нужно знать, как работают специальные символы:

  • Символ обратной косой черты \ может заменять другой специальный символ в регулярном выражении:
  • Точка и w — .

Совпадение со всеми символами, кроме новых строк. Если хотите проверить на соответствие точке, и только точке — , на соответствие буквам, цифрам и нижнему подчеркиванию — w

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

Совпадение с символами внутри скобок. Поддерживает диапазоны. Некоторые примеры:
o — соответствует любым a, b или c.
o прописные буквы.
o любая цифра.
o — соответствует любому буквенному символу в нижнем или верхнем регистре.
Опционально? Соответствие 0 или 1.
Звездочка *.

Звездочка обозначает 0 или более символов.

Соответствие 1 или более символам.

Фигурные скобки {}.

Минимальное и максимальное значения. Некоторые примеры синтаксиса регулярных выражений:
o {1,} не менее 1.
o {1,3} от 1 до 3.
o {1,64} от 1 до 64.

Добавим все это, чтобы получить регулярное выражение для адресов электронной почты:

/+@+(.+)*/i


Как это выглядит в PHP :

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Использование регулярного выражения для валидации

Задача : убедиться, что вводимые данные — это то, что мы ожидаем. Цель 1 : /[^w$.]/ Цель 2: /^{1,2}$/

Регулярные выражения подходят для поиска элементов, но вам нужно знать, что именно вы ищете.

Когда не стоит использовать регулярное выражение для проверки?

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

filter_var("[email protected]", FILTER_VALIDATE_EMAIL)

Валидация с помощью регулярных выражений

Регулярные выражения в конце строки используют анкоры:

^ — указывает начало строки.
$ — знак доллара, который указывает конец строки.

if (!preg_match("%^{1,2}$%", $_POST["subscription_frequency"])) { $isError = true; }

Исключенные классы символов

[^abc] — все, кроме a , b или c , включая новые строки.

Пример, который обеспечивает ввод только буквенно-цифровых символов, тире, точки, подчеркивания:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) { $isError = true; }

Поиск и замена

Наиболее распространенными функциями PCRE для выполнения поиска и замены являются preg_replace() и preg_replace_callback() . Но есть также preg_filter() и preg_replace_callback_array() , которые делают почти то же самое. Обратите внимание, что функция preg_replace_callback_array() доступна, начиная с PHP7 .

Заменить слова в списке

$subject = "I want to eat some apples."; echo preg_replace("/apple|banana|orange/", "fruit", $subject);

Результат

I want to eat some fruits.

Если в регулярном выражении есть подшаблоны (в круглых скобках ), можно заменить $N или N (где N является целым числом > = 1 ), это называется «обратная ссылка».

Перестановка двух чисел

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

Результат

Изменение форматирования даты

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

Результат

Простой пример замены URL-адреса в теге

$subject = "Please visit https://php.earth/doc for more articles."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject);

Результат

Please visit php.earth/doc for more articles.

Иногда нужно выполнить сложный поиск и замену, например, при фильтрации/проверке перед заменой. В этой ситуации может пригодиться preg_replace_callback() .

Приведенное в предыдущем примере регулярное выражение может заменить только URL-адреса , начинающиеся с http или https . Но теперь нам также нужно заменить URL-адреса, начинающиеся с www. Кто-то подумает, что можно просто изменить https? : // в подшаблоне. Например, на (?: Https? : // | www . ), Но это не будет работать в большинстве браузеров, потому что они будут интерпретировать www.domain как относительный путь.

Поэтому в конструкторе регулярных выражений перед заменой нужно выполнить некоторые действия, добавив http:// , если URL-адрес начинается с www .

function add_protocol_if_begins_with_www($matches) { $url = strtolower($matches) === "www." ? "http://" . $matches : $matches; return "{$matches}"; } $subject = "Please visit www.php.earth/doc for more articles."; echo preg_replace_callback("#(https?://|www.)([^s./]+(?>.[^s./]+)*[^s]*)#i", "add_protocol_if_begins_with_www", $subject);

Результат


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


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


Я думаю, вы неоднократно сталкивались с ситуациями, когда у вас есть текст (например, в Microsoft Word) и вам надо найти в нём что-то важное. Если вы знаете, что именно ищете - всё просто: вызвали диалог поиска, ввели искомое слово, нажали кнопку и вуаля - текст найден.


Но что вы будете делать, если вы заранее знаете только тип искомой информации? Например, перед вами стоит задача найти все адреса электронной почты в документе на пару сотен листов. Некоторые будут просматривать документ вручную, некоторые - введут в поиске собаку (@) и будут искать её. Согласитесь - оба вариата это каторжный неблагодарный труд.

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

Регулярное выражение - это текстовая строка, составленная по определённым законам и правилам. Строка состоит из символов и групп символов, метасимволов, квантификаторов и модификаторов.

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

// читаемые символы a Е // нечитаемые символы и коды \x41 - то же что буква "A" \x09 - символ табуляции

Группа символов - это несколько символов, записанные последовательно:

Абвг ACZms

Сразу обращаю ваше внимание - "пробел" в регулярных выражения тоже рассматривается как значимый символ, поэтому при написании выражений будьте внимательны. Например, эти граппы символов являются РАЗНЫМИ выражениями:

АБВГДЕ АБВ ГДЕ

Следующий элемени языка - метасимволы. Приставка "мета" означает, что эти символы описывают некие другие символы или их группы. В таблице рассмотрены основные метасимволы языка регулярных выражений:

Метасимволы для задания специальных символов
() Скобки. Определяют вложенные выражения.
| Метасимвол выбора
^ Метасимвол начала строки
$ Метасимвол конца строки
\n Символ перевода строки (шестнадцатеричный код 0x0A)
\r Символ возврата каретки (шестнадцатеричный код 0x0D)
\t Символ табуляции (шестнадцатеричный код 0x09)
\xhh Вставка символа с шестнадцатиричным кодом 0xhh, например \x42 вставит латинскую букву "B"
Метасимволы для задания групп символов
. Точка. Любой символ.
\d Цифра (0-9)
\D Не цифра (любой символ кроме символов 0-9)
\s Пустой символ (обычно пробел и символ табуляции)
\S Непустой символ (все, кроме символов, определяемых метасимволом \s)
\w "Словарный" символ (символ, который используется в словах. Обычно все буквы, все цифры и знак подчеркивания ("_"))
\W Все, кроме символов, определяемых метасимволом \w

Метасимволы из второй половины таблицы очень легко запомнить. "d" - digit (цифра), "s" - symbol (символ), "w" - word (слово). Если буква большая - значит надо добавить "НЕ" в описанию группы.

Возьмём для примера текст "На красной майке цифры 1812, а на зелёной майке - 2009". Рассмотрим примеры простейших регулярных выражений:

\d\d\d\d - найдёт 1812 и 2009 \D - найдёт все буквы, пробелы и знаки препинания \s - найдёт все пробелы в тексте.

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

Означает любую цифру (то же, что \d) - означает чётную цифру - обозначает любой символ латниского алфавита (в любом регистре) или цифру.

Например, выражение \d\d\d в тестовой строке найдёт только 1812, но не 2009. Это выражение следует читат как "найти все последовательности из четырёх цифр, где последняя цифра равна 0,2,4,6 или 8".

Нам осталось упомянуть лишь квантификаторы и модификаторы.

Квантификатор - это специальная конструкция, определяющая, сколько раз должен встретиться символ или группа символов. Квантификатор записывается в фигурных скобках "{}". Возможны два формата записи: точный и диапазонный. Точный формат записывается так:

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

Вторая форма записи - диапазонная. Записывается как

{X, Y} // или {,Y} // или {X,}

где X - минимальное, а Y - максимальное количество повторений. Например:

читается как "от двух до четырёх последовательно записанных цифр". Если одна из границ не указана, то подразумевается отсутствие ограничения. Например:

\w{3,} - три и более букв. \d{,5} - цифр нет вообще, либо есть, но не более пяти.

Квантификаторы могут применяться как к одному символу, так и к группе:

[ А-Яа-я ]{1,3}

Эта конструкция выберет из текста все русские слова из одной, двух или трёх букв (например, "или", "не", "я", "иду" и т.п.)

Кроме фигурных скобок с уществует ещё три метасимвола-квантификатора: "*" (звёздочка), "+" (плюс) и "?" (вопрос). Их испльзуют в случаях, когда заранее неизвестно минимальное и максимальное количество необходимых повторений. Например, при поиске адресов электронной почты нельзя заранее сказать, сколько символов будет в имени пользователя (до "собаки"), а сколько - в имени домена (после "собаки").

Метасимвол "*" читается как "любое количество от нуля и более", т.е. конструкция

определяет любое количество последовательных букв, в том числе и их полное отсутствие.

Символ "+" отличается от звёздочки лишь тем, что требует наличия хотя-бы одного символа. Т.е. конструкция

соответствует любой цифровой последовательности, где цифр одна или более.

Символ "?" соответствует отсутствию или наличию единственного символа. Т.е. конструкция

соответствует любой цифровой последовательности, где цифр одна или две.

Здесь стоит упомянуть о такой особенности антификаторов "*" и "+" как жадность . Суть в том, что по-умолчанию эти символы соответствуют максимально длинной последовательности символов. Например, для строки "мама мыла раму" выражение:

выберет "мама мыла ра", что несколько неожиданно, ведь мы предполагали получить "ма". Для изменения такого поведения используется метасимвол "?" (знак вопроса), записанный сразу после квантификатора. Он органичивает "аппетит" квантификаторов, заставляя их возвращать первое совпадение, а не самое длинное. Теперь изменим предыдущий пример:

и получим требуемое совпадение "ма".

Последний элемент языка - модификаторы . Модификатор - это спецсимвол, определяющий "системные" параметры анализа регулярных выражений. Таких символов всего четыре, они могут применяться как по отдельности, так и одновременно:

i Включает режим case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы "^" и "$" указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s По умолчанию метасимвол "." не включает в свое определение символ перевода строки. Т.е. для многострочного текста выражение /.+/ вернет только первую строку, а не весь текст, как ожидается. Указание этого модификатора снимает это ограничение.
U Делает все количественные метасимволы "не жадными" по умолчанию. В некоторых модификациях языка (в частности в PHP) вместо "U" используется символ "g", более соответствующий смыслу ("g" - сокращение от английского "greedy", "жадный").

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

Регулярные выражения в PHP.

Для работы с регулярными выражениями в PHP предназначены специальные функции, спосок которых и краткое описание приведены в таблице:

int preg_match (string pattern, string subject [, array matches])

Функция проверяет, совпадает ли содержимое subject с шаблоном pattern. Возвращает 1, если совпадения найдены, иначе возвращает 0. Если указать необязательный параметр-массив matches, то при выполнении функции в него будут занесен единственный элемент - первое найденное совпадение.

"; print_r($found); ?>

int preg_match_all (string pattern, string subject, array matches [, int order])
Функция идентична предыдущей, с единственным отличием - она производит поиск по всему тексту и возвращает в массиве matches ВСЕ найденные совпадения.
mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])
Как и обе предшествующие функции, preg_replace производит поиск фрагмента текста, соответствующего шаблону. Все найденные фрагменты функция заменяет на указанный в параметрах текст. До очистки:\n$text\n\n"; $text = preg_replace("/(\n \s{2,})/"," ",$text); echo "После очистки:\n$text"; // выведет текст, очищенный от спецсимволов // и лишних пробелов?>
mixed preg_replace_callback (mixed pattern, mixed callback, mixed subject [, int limit])
Функция является расширенной версией предыдущей. Главное отличие - этой функции в параметрах передаётся имя функции, которая будет анализировать текст и формировать замещающий текст.
array preg_split (string pattern, string subject [, int limit [, int flags]])
Эта функция аналогична функциям explode() и split(). Её особенность в том, что в качестве разделителя выступает не фиксированная строка, а регулярное выражение. Функция разбивает исходные данные на элементы и помещает их в выходной массив.
array preg_grep (string pattern, array input)
Функция предназначена для регулярного поиска в массивах. Для поиска задаётся шаблон и массив входных данных, а возвращается массив, состоящий только из элементов, соответствющих шаблону.

Рассмотренный список функций далеко не полон, но вполне достаточен для успешного начала работы с регулярными выражениями. Если вы заинтересовались этой темой - обязательно почитайте дополнительную литературу (например, книгу Фридла "Регулярные выражения"). Кроме того, в целях обучения рекомендую поставить одну из специальных программ для тестирования регулярных выражений (например, "PCRE" или "RegEx Builder").

Заметка о регулярных выражениях. Зачем они нужны, где используются и как их применять. Иными словами о поиске в PHP.

Регулярные выражения — это набор указателей, которые используются в поиске, для нахождения нужных данных.

Использование регулярных выражений в функциях PHP, замены , поиска .

Например, рассмотрим такую функция:

preg_replace("/(]*>)(.*?)(<\/div>)/i", "$1$3", $string);

То что внутри этой функции, все эти на первый взгляд непонятные значения, называется регулярным выражением (PHP RegEx) . Они используются для поиска конкретных данных.

Шаблон (символы) поиска берет своё начало с языка Perl .

Регулярные выражения делятся на метасимволы и модификаторы метасимволов.

Метасимволы — определяют группу обычных символов. Модификаторы — помогают понять сколько и какое количество этих символов искать.

Метасимволы регулярного выражения

Значения некоторых метасимволов из примера выше (также они будут встречаться ниже):

^ - начало строки
\ - считать следующий элемент обычным символом (не командой)
. - один произвольный (любой случайный) символ
() - группировка (подмаска)
- класс символов
$ - конец строки
| - альтернатива (или)

Модификаторы регулярного выражения

* - повторять от 0 до бесконечности
? - искать 1 раз или меньше

Ещё модификаторы, но не используются в текущих примерах:

Повторять 1 или большее число раз
{n} - точное количество раз (заменить n цифрой)
{n,5} - по меньшей мере 5 раз
{n,m} - не меньше n, но и не больше m

Любой из вышеперечисленных модификаторов сочетается с модификатором «?». Он необходим для ограничения поиска, потому что по умолчанию все метасимволы повторяются по принципу «жадности» (без ограничения) .

Например:

(<.*>) - найдет всю строку со всеми тегами
(<.*?>) - найдет только теги

Дополнительные опции

Кроме модификаторов и метасимволов есть опции (приведены не все):

/i - не имеет значения регистр символов (строчные и заглавные)
/s - делает точки (.) переносом строки и возврата каретки (сдвиг влево).
/U - превращается все количественные метасимволы в "не жадные".

Опции могут сочетаться вместе:

Шаблоны

Также существуют шаблоны, что-то вроде аналога метасимволов, один из них:

\n - новая строка

На данной странице приведены не все параметры регулярных выражений. Это сделано специально, чтобы не запутать новичка и в то же время дать ему основные инструменты для поиска. В дальнейшем, при желании углубиться в детали, в Интернете можно найти более подробную инструкцию.

Эксперименты

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

Регулярные выражения - это специальные шаблоны для поиска подстроки в тексте. С их помощью можно решить одной строчкой такие задачи: «проверить, содержит ли строка цифры», «найти в тексте все адреса email», «заменить несколько идущих подряд знаков вопроса на один».

Начнем с одной народной программистской мудрости:

Некоторые люди, сталкиваясь с проблемой, думают: «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

Примеры шаблонов

Начнем с пары простых примеров. Первое выражение на картинке ниже ищет последовательность из 3 букв, где первая буква это «к», вторая - любая русская буква и третья - это «т» без учета регистра (например, «кот» или «КОТ» подходит под этот шаблон). Второе выражение ищет в тексте время в формате 12:34 .

Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве него обычно используют символ / , но можно использовать и другие символы, не имеющие специального назначения в регулярках, например, ~ , # или @ . Альтернативные разделители используют, если в выражении может встречаться символ / . Затем идет сам шаблон строки, которую мы ищем, за ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они задают дополнительные опции при поиске текста. Вот примеры флагов:

  • i - говорит, что поиск должен вестись без учета регистра букв (по умолчанию регистр учитывается)
  • u - говорит, что выражение и текст, по которому идет поиск, исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск русских (и любых других нелатинских) символов может работать некорректно, потому стоит ставить его всегда.

Сам шаблон состоит из обычных символов и специальных конструкций. Ну например, буква «к» в регулярках обозначает саму себя, а вот символы значат «в этом месте может быть любая цифра от 0 до 5». Вот полный список специальных символов (в мануале php их называют метасимволы), а все остальные символы в регулярке - обычные:

Ниже мы разберем значение каждого из этих символов (а также объясним почему буква «ё» вынесена отдельно в первом выражении), а пока попробуем применить наши регулярки к тексту и посмотреть, что выйдет. В php есть специальная функция preg_match($regexp, $text, $match) , которая принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0 , если нет, или 1 , если она есть. А в переданный массив в элемент с индексом 0 кладется первое найденное совпадение с регуляркой. Напишем простую программу, применяющую регулярные выражения к разным строкам:

Познакомившись с примером, изучим регулярные выражения более подробно.

Скобки в регулярных выражениях

Давай повторим, что обозначают разные виды скобок:

  • Фигурные скобки a{1,5} задают число повторений предыдущего символа - в этом примере выражение ищет от 1 до 5 идущих подряд букв «a»
  • Квадратные скобки означают «один любой из этих символов», в данном случае - буквы a, b, c, x, y, z или цифра от 0 до 5. Внутри квадратных скобок не работают другие спецсимволы вроде | или * - они обозначают обычный символ. Если в квадратных скобках в начале стоит символ ^ то смысл меняется на противоположный: «любой один символ, кроме указанных» - например [^a-c] значит «один любой символ, кроме a, b или c».
  • Круглые скобки группируют символы и выражения. Например в выражении abc+ знак «плюс» относится только к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если поставить скобки a(bc)+ то квантифиактор плюс относится уже к последовательности bc и выражение ищет слова abc, abcbc, abcbcbc

Примечание: в квадратных скобках можно указывать диапазоны символов, но помни, что русская буква ё идет отдельно от алфавита и чтобы написать «любая русская буква», надо писать [а-яё] .

Бекслеши

Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил, что бекслеш везде пишут по-разному. Где-то пишут один бекслеш: \d , а здесь в примерах он повторен 2 раза: \\d . Почему?

Язык регулярных выражений требует писать бекслеш один раз. Однако в строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое значение: мануал про строки . Ну например, если написать $x = "\$"; то PHP воспримет это как специальную комбинацию и вставит в строку только символ $ (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы вставить в строку последовательность \$ , мы должны удвоить бекслеш и записать код в виде $x = "\\$"; .

По этой причине в некоторых случаях (там, где последовательность символов имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:

  • Чтобы написать в регулярке \$ , мы пишем в коде "\\$"
  • Чтобы написать в регулярке \\ , мы удваиваем каждый бекслеш и пишем "\\\\"
  • Чтобы написать в регулярке бекслеш и цифру (\1), бекслеш надо удвоить: "\\1"

В остальных случаях один или два бекслеша дадут один и тот же результат: "\\d" и "\d" вставят в строку пару символов \d - в первом случае 2 бекслеша это последовательность для вставки бекслеша, во втором случае специальной последовательности нет и символы вставятся как есть. Проверить, какие символы вставятся в строку, и что увидит движок регулярных выражений, можно с помощью echo: echo "\$"; . Да, сложно, а что поделать?

Специальные конструкции в регулярках

  • \d ищет одну любую цифру, \D - один любой символ, кроме цифры
  • \w соответствует одной любой букве (любого алфавита), цифре или знаку подчеркивания _ . \W соответствует любому символу, кроме буквы, цифры, знака подчеркивания.

Также, есть удобное условие для указания на границу слова: \b . Эта конструкция обозначает, что с одной стороны от нее должен стоять символ, являющийся буквой/цифрой/знаком подчеркивания (\w), а с другой стороны - не являющийся. Ну, например, мы хотим найти в тексте слово «кот». Если мы напишем регулярку /кот/ui , то она найдет последовательность этих букв в любом месте - например, внутри слова «скотина». Это явно не то, что мы хотели. Если же мы добавим условие границы слова в регулярку: /\bкот\b/ui , то теперь искаться будет только отдельно стоящее слово «кот».

Мануал

  • Синтаксис регулярных выражений в PHP , подробное описание