» » Preg match php примеры. Регулярные выражения в PHP. Примеры регулярных выражений

Preg match php примеры. Регулярные выражения в PHP. Примеры регулярных выражений

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

Введение в регулярные выражения

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

Синтаксис регулярных выражений

Регулярное выражение Означает
foo Строка “foo”
^foo Строка начинается с “foo”
foo$ Строка заканчивается на “foo”
^foo$ «foo» встречается в строке только один раз
a, b, или c
любой символ в нижнем регистре
[^A-Z] любой символ, не находящийся в верхнем регистре
(gif|jpg) Означает как «gif” так и “jpeg”
+ Один или более символов нижнего регистра
Любая цифра, точка или знак минус
^{1,}$ Любое слово, хотя бы одна буква, число или _
()() wy, wz, xy, или xz
(^A-Za-z0-9) Любой символ (не число и не буква)
({3}|{4}) Означает три буквы или 4 цифры

PHP-функции для регулярных выражений

Функция Описание
preg_match() Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях
preg_match_all() Функция preg_match_all() находит все вхождения строки, заданной по шаблону
preg_replace() Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение.
preg_split() Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска.
preg_grep() Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения.
preg_quote() Экранирует символы регулярного выражения

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

Проверяем, является ли строка правильным доменным именем

$url = "http://komunitasweb.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(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 блоге

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

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

Echo $title;

Теперь, выше этой строки, добавьте этот код:

\0", $title); ?>

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

Strong.search-excerpt { background: yellow; }

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

Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL

$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. Повторюсь, эту функцию очень удобно использовать вместе с cURL.

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; }

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

Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.

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

Поиск заголовка статьи

Этот фрагмент кода найдет и выведет на экран текст, находящийся внутри тэгов , на html-странице.

$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp)){ $page .= fgets($fp, 4096); } $titre = eregi("(.*)",$page,$regs); echo $regs; fclose($fp);

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

Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?

//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)[^"]*)"$"

Замена двойных кавычек “умными” кавычками

Если вы любитель типографики, вам понравится это регулярное выражение, заменяющее обычные двойные кавычки, на “умные кавычки”. Похожее регулярное выражение используется в wordpress в контенте страницы.

Preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

Комплексная проверка пароля

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

Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.

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

WordPress: Использование регулярного выражения для получения картинок из записи

Поскольку многие из вас являются пользователями 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) { // Now here you would do whatever you need to do with the images // For this example the images are just displayed for ($i=0; $i < $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Генерация автоматических смайлов

Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.

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

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

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

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

Язык PHP содержит три механизма работы с регулярными выражениями - «ereg», «mb_ereg» и «preg». Наиболее распространенным является интерфейс «preg», функции которого обеспечивают доступ к библиотеке поддержки регулярных выражений PCRE, изначально разработанной для языка Perl, которая входит в комплект PHP. Preg-функции ищут в заданной текстовой строке совпадения, согласно определенному шаблону на языке регулярных выражений.

Основы синтаксиса

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

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

Например, в выражении /\d{3}-\d{2}-\d{2}/m разделителем будет «/» , далее идет шаблон, а символ «m» будет модификатором.

Вся мощь регулярных выражений кодируется с помощью метасимволов. Основным метасимволом языка является обратный слэш - «\». Он меняет тип следующего за ним символа на противоположный (т. е. обычный символ превращается в метасимвол и наоборот). Другим важным метасимволом является прямая черта «|», задающая альтернативные варианты шаблона. Еще примеры метасимволов:

PHP, обрабатывая регулярные выражения, пробел рассматривает как отдельный значимый символ, поэтому выражения АБВГДЕ и АБВ ГДЕ являются разными.

Подшаблоны

В PHP регулярные подшаблоны выделяются круглыми скобками и иногда называются «подвыражениями». Выполняют следующие функции:

    Выделение альтернатив . Например, шаблон жар(кое|птица|) совпадет со словами «жар», «жар-птица» и «жаркое» . А без скобок это будет только пустая строка, «птица» и «жаркое».

    «Захватывающий» подшаблон. Это означает, что если в шаблоне совпала подстрока, то в качестве результата возвращаются все совпадения. Для наглядности приведем пример. Дано следующее регулярное выражение: победитель получает((золотую|позолоченный)(медаль|кубок)) - и строка для поиска совпадений: «победитель получает золотую медаль» . Кроме исходной фразы, в результате поиска будут выданы: «золотую медаль» , «медаль», «золотую» .

Операторы повторений (квадрификаторы)

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

Для описания повторений применяются квадрификаторы - метасимволы для задания количества. Квадрификаторы бывают двух типов:

  • общие, заключенные в скобки;
  • сокращенные.

Общий квантификатор задет минимальное и максимальное количество разрешенных повторений элемента в виде двух чисел в фигурных скобках, например так: х{2,5}. Если максимальное количество повторений неизвестно, второй аргумент не указывается: х{2,}.

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

1. * - ноль и больше повторений, что эквивалентно {0,}.

2. + - одно и более повторений, т. ,}.

3. ? - ноль или только одно повторение - {0,1}.

Примеры регулярных выражений

Для тех, кто изучает регулярные выражения, примеры - лучший учебник. Мы приведем несколько, которые показывают их широкие возможности при минимуме усилий. Все программные коды полностью совместимы с версиями PHP 4.x и выше. Для полного понимания синтаксиса и использования всех возможностей языка рекомендуем книгу Дж. Фридла «Регулярные выражения», где полностью рассматривается синтаксис и имеются примеры регулярных выражений не только на PHP, но и для языков Python, Perl, MySQL, Java, Ruby и C#.

Проверка корректности адреса E-mail

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

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

Итак, выражение, проверяющее правильность email, должно проверять следующие условия:

  1. Наличие в исходной строке символа @ и отсутствие пробелов.
  2. Доменная часть адреса, за символом @, содержит только допустимые символы для доменных имен. То же относится и к имени пользователя.
  3. При проверке имени пользователя необходимо определить наличие специальных символов, таких как апостроф или Такие символы относятся к потенциально опасным и могут содержаться в таких видах нападений, как SQL-инъекции. Избегайте таких адресов.
  4. Имена пользователя допускают наличие только одной точки, которая не может быть первым или последним символом в строке.
  5. Доменное имя должно содержать не меньше двух и не более шести символов.

Пример, учитывающий все указанные условия, можно увидеть далее на рисунке.

Проверка правильности адресов URL

Задача. Проверить, является ли заданная текстовая строка допустимым Еще раз отметим, что регулярные выражения URL-проверки могут быть реализованы различными способами.

Решение. Наш итоговый вариант выглядит следующим образом:

/^(https?:\/\/)?([\da-z\.-]+)\.({2,6})([\/\w \.-]*)*\/?$/

Теперь разберем его составляющие более подробно, используя рисунок.

Проверяем номера кредитных карт

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

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

Написать универсальное выражение, учитывающее возможные пробелы и дефисы, сложнее, чем просто отбросить все символы, кроме цифр. Поэтому в выражении рекомендуется использовать метасимвол /D, который удаляет все символы, кроме цифр.

Теперь можно переходить непосредственно к проверке номера. Все компании, выпускающие кредитные карты, используют уникальный формат номера. В примере это используется, и клиенту нет необходимости вводить наименование компании - она определяется по номеру. Карты Visa всегда начинаются с 4 и имеют длину номера в 13 или 16 цифр. MasterCard начинается в диапазоне 51-55 с длиной номера 16. В итоге получаем такое выражение:

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

Проверка телефонных номеров

Задача. Проверка корректности введенного телефонного номера.

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

+CCC.NNNNNNNNNNxEEEE, где:

C - это код страны, состоящий из 1-3 цифр.

N - номер длиной до 14 цифры.

E - необязательное расширение.

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

В результате имеем следующее выражение:

^\+{1,3}\.{4,14}(?:x.+)?$

Числа в диапазоне

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

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

Поиск IP-адреса

Задача. Необходимо определить, является ли заданная строка допустимым IP-адресом в формате IPv4 в диапазоне от 000.000.000.000-255.255.255.255.

Решение. Как и в любой задаче на языке PHP, регулярное выражение имеет множество варинтов. Например, такое:

Онлайн-проверка выражений

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

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

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

Существует несколько разных диалектов регулярных выражений, среди которых один из самых распространенных и развитых является синтаксис Perl -совместимых регулярных выражений (PCRE - Perl Compatible Regular Expressions ).

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

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

Допустимо использовать инструкции модификаторы шаблона, которые действующие на все регулярное выражение. Например, модификатор "i " будет осуществлять поиск по регулярному выражению без учета регистра. Для русских символов в кодировке UTF8 , для правильной обработки необходимо добавлять модификатор "u " (PCRE_UTF8 ). Например:
"/комп/ui" Регулярное выражение из примера будет соответствовать как строке "компьютер ", так и "КОМПЬЮТЕР ".

Для привязки регулярного выражения к началу слова используется символ "^ " (caret - знак вставки):
"/^свет/" Данное выражение будет соответствовать строке "светильник ", и не будет соответствовать слову "рассвет ".

Знак доллара "$ " означает конец строки:
"/^светильник$/" Данное регулярное выражение соответствует исключительно строке "светильник ", где после искомого слова нет другого текста.

Следующее регулярное выражение соответствует пустой строке:
"/^$/" Очень часто в поисковой строке содержится символ начала и конца регулярного выражение, в нашем случае символ косой черты "/ ". В этом случае необходимо экранировать данный символ с помощью символа обратного слеша (\ ):
"/^светильник\/потолочный$/" В данном примере регулярное выражение будет соответствовать строке светильник/потолочный ".

В качестве разделителя может выступать любой другой символ, например "| ":
"|^светильник\/потолочный$|ui" Изменять разделители необходимо выходя из задачи поиска, например, если символ косой черты "/ " встречается часто в поисковой строке, то его можно изменить.

Следует быть очень внимательными используя некоторые символы для разделителей, поскольку они могут выполнять свою роль в шаблоне. Использование символа вертикальной черты "| " в регулярном выражении может быть использовано для задания альтернативных масок:
"/^abc|def$/" Данному регулярному выражению соответствует любая строка, содержащая подстроки "abc " или "def ". Вертикальную черту в большинстве случаев применяют при проверке, например, расширений файлов или зон доменных имен.

Подстроки в регулярных выражениях можно группировать при помощи скобок "() ":
"/^цвет (красный|синий|зеленый)$/" Это регулярное выражение будет соответствовать строке вида "цвет красный ", но вместо "красный " может быть как "синий ", так и "зеленый ".

Для использования скобок как части искомой строки, их следует экранировать. Например, соответствовать строке "цвет (красный) " будет следующее регулярное выражение:
"/^цвет \(красный\)$/" Кроме группировки символов, скобки имеют еще одно предназначение. Все выражения, найденные в скобках, сохраняются интерпретатором, и к ним можно обратиться при замене или поиске по номеру скобки.

Чтобы задать класс символов необходимо использовать квадратные скобки "". Они ограничивают поиск теми символами, которые в них заключены:
"//" Данному регулярному выражению будет соответствовать подстрока, которая содержит хотя бы один символ из "abc ".

Для создания регулярного выражения, которое соответствует всем буквам английского алфавита, можно перечислить все буквы в регулярном выражении, а можно записать более коротко следующим образом:
"//i" Любые два символа, разделяемые дефисом, задают соответствие диапазону символов, находящихся между ними. В данном регулярном выражении описаны символы нижнего регистра, но модификатор "i " осуществляет регистрозависимый поиск.

Аналогичным образом задаются регулярные выражения, соответствующие цифре:
"//" При использовании экранирования обратным слешем некоторые символы выполняют специальную интерпретацию:

\d - любая десятичная цифра ( );

\D - любой символ, кроме десятичной цифры;

\s - любой пробельный символ ([ \r\n\t\f] );

\S - любой непробельный символ;

\w - любой символ, образующий "слово" ( );

\W - любой символ, не образующий "слово";

\t - символ табуляции;

\n - символ перевода строки;

\\ - символ обратного слеша (\ );

\. - символ точки (. ).

Символ точки ". " обозначает любой символ в регулярном выражении кроме символов разрыва строки "\r " или "\n ", поэтому для поиска точки следует экранировать этот символ.

Регулярное выражение для числа можно записать следующим образом:
"/[\d]/" Чтобы исключить класс символов из поиска необходимо в квадратных скобках поставить первым символ "^ ", который действует уже не как указатель границы строки, а как отрицание:
"/[^0-9]/" Данное регулярное выражение отвечает любому символу, не содержащемуся в диапазоне "0-9 ".

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

? - символ либо входит в строку один раз, либо вообще в нее не входит;

* - любое число вхождений символа в строку, в том числе и 0;

+ - одно или более число вхождений символа в строку.

Например, если необходимо найти подстроку, содержащую одну или более цифр, следует воспользоваться выражением вида:
"/[\d]+/" Символ "* " используется для любого числа вхождений строки в подстроку, то есть слудеющее регулярное выражение соответствует либо пустой строке, либо строке, содержащей неограниченное количество цифр.
"/^[\d]*$/" В регулярных выражениях так же применяются фигурные скобки ({} ), которые предназначены для указания числа или диапазона чисел повторения элемента:

"ab{2} " - соответствует строке "abb ";

"ab{2,} b " следует не менее двух "b ";

"ab{2,4} " - соответствует строке, в которой за "b " следует от 2 до 4 символов "b ".

Выражение "{0,} " полностью аналогично "* ", а "{1,} " - "+ ". Выражение "{0,1} " можно записать более коротко, используя "? ".

Для объединения символов в последовательность, их необходимо поместить в круглые скобки. Например, следующее регулярное выражение соответствует строке, в которой за "a " следует от 2 до 4 последовательностей "bc ";
"a(bc){2,4}/" Существует модификатор U , который инвертирует жадность. Например, выражение <.*> соответствует строке, содержащей несколько тегов HTML-разметки, целиком. Чтобы выделить отдельные теги, можно применить жадность: <.*?> или <.*>/U .

Жадность квантификаторов может оказаться значительной проблемой. Например, часто ожидают, что выражение <.*> найдет в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.

Функции для работы с регулярными выражениями

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

Первой рассмотрим функцию Preg_match , которая осуществляет поиск в строке по регулярному выражению и имеет следующий синтаксис:
int preg_match(string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]]) Функция Preg_match ищет в заданном тексте Subject совпадения с шаблоном Pattern . Если задан необязательный параметр Matches , то результаты поиска помещаются в массив. Элемент $matches будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[i] - часть строки, соответствующей первым круглым скобкам, $matches - вторым и т. д.

Необязательный параметр Flags может принимать единственное значение PREG_OFFSET_CAPTURE , при указании которого изменяется формат возвращаемого массива $matches - каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение. Поиск осуществляется слева направо, с начала строки.

Функция Preg_match возвращает количество найденных соответствий, которое может принимать только 2 значение - 0 (совпадения не найдены) и 1 , поскольку данная функция прекращает свою работу после первого найденного совпадения.

Для поиска всех совпадений, следует воспользоваться функцией Preg_match_all , которая имеет следующий синтаксис:
int preg_match_all(string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]]) Функция Preg_match_all ищет в строке Subject все совпадения с шаблоном Pattern и помещает результат в массив Matches в порядке, определяемом комбинацией флагов Flags . Так же как и в предыдущей функцией можно задать смещение Offset , начиная с которого будет осуществляться поиск встроке Subject . После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

Перейдем к функции, которая кроме поиска осуществляет и замену по регулярному выражению - Preg_replace :
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count ]]) Функция Preg_replace выполняет поиск совпадений в строке Subject с шаблоном Pattern и заменяет их на Replacement .

Функция Preg_split разбивает строку по регулярному выражению.
array preg_split(string $pattern, string $subject [, int $limit = -1 [, int $flags = 0 ]]) Функция возвращает массив, состоящий из подстрок заданной строки Subject , которая разбита по границам, соответствующим шаблону Pattern .

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

Также существуют дополнительные конструкции шаблонов:

(?#комментарий) - комментарий в теле шаблона. Иногда очень полезно разместить в теле регулярного выражения конкретный комментарий для лучшего понимания работы.

(?:шаблон) - группировка как и "() ", но без обратной ссылки. Данная группировка очень полезна для задания шаблона но без создания обратной ссылки.

(?=шаблон) - "заглядывание" вперед. Данная конструкция может понадобится для поиска по шаблону с наперед указанным выражением, например, выражение "/\w+(?=\t)/ " соответствует слову, за которым идет символ табуляции, но символ "\t " не включается в результат.

А теперь опишем наиболее часто употребляемые примеры использования регулярных выражений:

Проверка правильности ввода E-mail :
preg_match("/^+@+\.{1,6}$/ui", $email) До символа собачки шаблон ищет буквы и цыфры, знак тире, нижнего подчеркивания и
крапки одно или более число вхождений начиная от начала строки:
^+ Далее следует вторая часть почтового адреса, начиная с собачки имея тот же набор символов, что и первая часть:
@+ После этого проверяем доменную зону, которая состоит исключительно из строки букв определенного количества символов до конца строки:
\.{1,6}$ Также с помощью регулярного выражения мы может выбрать все E-mail из текста:
$text = "Здесь текст и почтовый адрес [email protected] а также еще один адрес [email protected]";
preg_match_all("/+@+\.{1,6}/ui", $text, $matches, PREG_PATTERN_ORDER);
foreach ($matches as $key => $val) {
$email = filter_var($val, FILTER_VALIDATE_EMAIL);
if ($email) $output = $email;
} В отличии от проверка правильности ввода E-mail , при выборке мы убрали в шаблоне символ начала (^ ) и конца ($ ) строки. Результат данного примера:
Array
=> [email protected]
=> [email protected]
) Проверка правильности ввода имени:
preg_match("#^[а-яґїієa-z\-\_\".\d\s]+$#ui", $name); Проверка правильности ввода числа:
preg_match("/(+)/ui", $id) Корректность ввода даты:
$date = "2017.05.25";
preg_match("/^{4}.{2}.{2}$/ui", $date); Удалить все определения стилей Style :
preg_replace("/style=\"[^\"]*\"/", "", $string); Поскольку стили могут находится внутри практически любого тега, в примере удаляется исключительно само определение стиля без тега.

Удалить все определения строчных элементов документа Span :
preg_replace("#]*?>#is", "", $string);
preg_replace("#<\/span>#is", "", $table); Точно так же можно удалить любой тег, например, для заголовка H1 :
preg_replace("#]*?>#is", "", $table);
preg_replace("#<\/h1>#is", "", $table); Очистку таблиц с помощью регулярных выражений PHP можно осуществить так:
// Удаляем все из атрибутов Table:
$table = preg_replace("##siU", "

", $table);
// Удаляем все из атрибутов TR:
$table = preg_replace("##siU", "", $table);
// Удаляем все из атрибутов TD (кроме colspan или rowspan):
$table = preg_replace("#]+((colspan|rowspan)=[^\s>]+?)(|.*)>#siU", "

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


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


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


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

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

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

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

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

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

Абвг ACZms

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

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

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

", $table); Проверить правильность имени файла можно с помощью следующего регулярного выражения:
preg_match("/(^+(*))$/", $filename) Вырезать все изображения в тексте:
preg_replace("//", "", $content) Найти все ссылки:
preg_match_all("#]*href="(.*)"[^>]*>#Ui", $content , $url); Представьте ситуацию, когда пользователь не использует символ пробела после точки или запятой. В данном случае получается весьма большое слово, которое не всегда может поместится в необходимое поле, что провоцирует горизонтальную прокрутку. Чтобы этого не случилось, можно воспользоваться следующим регулярным выражением, которое после точки или запятой будет добавлять символ пробела:
preg_replace("/(\.|\,)([^\s])/ui", "$1 $2", $content) Найти все хештеги (#tag ) можно так:
preg_match_all("/\#(\w+[^\s]*)/ui", $text, $matches, PREG_PATTERN_ORDER); Или вручную добавить необходимые символы и их количество, разрешенные для составление хештегов:
preg_match_all("/\#({1,50})/ui", $text, $matches, PREG_PATTERN_ORDER);

Чаще всего регулярные выражения используются в Perl в операторах поиска и замены, таких как s// , m/ , операторах связки =~ или != и т.д. Как правило все эти операторы имеют схожие опции такие как:

Обычно все эти опции обозначают как "/x". Их можно использовать даже внутри шаблонов, используя новую конструкцию (?...)

Регулярные выражения или шаблоны (pattern) то же самое, что и regexp процедуры в Unix. Выражения и синтаксис заимствованы из свободно распространяемых процедур V8 Генри Спенсера (Henry Spencer), там же они подробно и описаны.

В шаблонах используются следующие метасимволы (символы обозначающие группы других символов) часто называемые egrep - стандартом:

Метасимволы имеют модификаторы (пишутся после метасимвола):

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом "*" эквивалентна {0,} , "+" - {1,} и "?" - {0,1}. n и m не могут быть больше 65536.

По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов. Если вы хотите "уменьшить их аппетит", то используйте символ "?". Это не изменяет значение метасимволов, просто уменьшает распространение. Таким образом:

Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):

\t - символ табуляции
\n - новая строка
\r - перевод каретки
- перевод формата
\v - вертикальная табуляция
\a - звонок
\e - escape
\033 - восьмеричная запись символа
\x1A - шестнадцатеричная
\c[ - control символ
\l - нижний регистр следующего символа
\u - верхний регистр -//-
\L - все символы в нижнем регистре до \E
\U - в верхнем -//-
\E - ограничитель смены регистра
\Q - отмена действия как метасимвола

Дополнительно в Perl добавлены следующие метасимволы:

Обратите внимание, что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:

Кроме того существуют мнимые метасимволы. Обозначающие не существующие символы в месте смены значения. Такие как:

Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов "\b" обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны "^" и "$", но если начало строки "^" и конец строки "$" действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.

Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как "\цифра". Заметьте, что за шаблоном в пределах выражения или блока эти группы обозначаются как "$цифра". Кроме этого существуют дополнительные переменные:

Пример:

$s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n"; # Результат "1" print "$2\n"; # "2" print "$+\n"; # "2" print "$&\n"; # "1 два 2" print "$`\n"; # "Один " print "$"\n"; # " и три 3" }

Perl версии 5 содержит дополнительные конструкции шаблонов:

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Найти цифру за которой стоит "-" { print "$1\n"; # Результат "2" } else { print "ошибка поиска\n"; }

(?!шаблон)- "заглядывание" вперед по отрицанию:

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Найти цифру за которой не стоит "+" { print "$1\n"; # Результат "2" } else { print "ошибка поиска\n"; }

(?ismx) - "внутренние" модификаторы. Удобно применять в шаблонах, где например нужно внутри шаблона указать модификатор.

Правила регулярного выражения. (regex)

  1. Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним "\".
  2. Строка символов обозначает строку этих символов.
  3. Множество возможных символов (класс) заключается в квадратные скобки "", это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это "^" - значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ "-", обозначающий диапазон символов. Например, a-z - один из малых букв латинского алфавита, 0-9 - цифра и т.д.
  4. форум портала PHP . SU
Метасимволы для задания специальных символов
() Скобки. Определяют вложенные выражения.
| Метасимвол выбора
^ Метасимвол начала строки
$ Метасимвол конца строки
\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").