Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Регулярные выражения в PHP
Здравствуй уважаемый читатель блога LifeExample, с момента публикации последней статьи прошло много времени, сегодня у меня появилось свободное время на написание новой. В этой статье я собираюсь систематизировать информацию об использовании регулярных выражений в PHP, собранную с разных сайтов.
Так сложилось, что последнее время мне часто приходится сталкиваться с проблемой поиска подстроки в тексте, причем эта подстрока может иметь не фиксированный набор символов. На примитивном уровне работы с текстом можно использовать стандартные функции PHP:
strpos() — Возвращает подстроку в строке.
substr() -Возвращает заданный участок строки.
strcmp() — Сравнивает две строки.
str_replace() — Заменяет в строке все вхождения одной подстроки на другую подстроку.
explode() – разбивает строку в массив по заданному разделителю
strip_tags() — Удаляет из строки все HTML тэги.
strtolower() – Перевод в нижний регистр.
strtoupper() – Перевод в верхний регистр.
trim() — Удаляет (» «, \n, \r, \t) символы в начале и в конце строки.
HtmlSpecialChars() — Заменяет специальные символы на их HTML эквиваленты.
convert_cyr_string() — Преобразует русский текст из одной кодировки в другую.
В большинстве случаев данным списком можно обойтись, хотя это далеко не все нужные функции. Наверное, у каждого начинающего программиста наступает период, когда приходится столкнуться с изучением регулярных выражений.
Регулярное выражение — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов.
Проще говоря, регулярное выражение представляет собой набор символов, описывающих правило поиска подстроки.
Для того чтобы было понятнее, сразу приведу легкий пример регулярного выражения в действии.
Предположим, у нас имеется строка:
Если применить к этой известной скороговорке регулярное выражение вида:
/(Клар.*?)\s/i
то мы получим три слова соответствующих данному шаблону: “Клары”, “Клара”, и “кларнет”.
На первый взгляд, запись регулярного выражения выглядит устрашающе, но как говорится: «Не так страшен черт, каким его малюют!».
Сейчас я вам объясню принцип формирования шаблона для регулярного выражения.
Первое, что необходимо понять: не все символы в нашем наборе относятся к сути описания шаблона! Посмотрите внимательно на следующие регулярные выражения:
/(Клар.*?)\/i
~(Клар.*?)\s~i
#(Клар.*?)\s#i
все они будут абсолютно одинаково работать, разница лишь в двух символах, служащих для отделения непосредственно шаблона от дополнительных служебных модификаторов. На месте таких разделителей может находиться любой символ, но необходимо, чтобы он находился в начале и в конце шаблона.
Последним символом в нашем регулярном выражении стоит латинская буква i, наличие которой свидетельствует о том, что шаблон будет регистронезависимым. Если убрать этот модификатор, то в результате приведенного выше примера окажется не три слова, а два: “Клары” и “Клара”.
Откинув из нашего выражения разделители и служебные модификаторы, мы получим чистый шаблон регулярного выражения:
(Клар.*?)\s
Под действие данного шаблона попадут все подстроки в тексте, которые отвечают следующим правилам:
- Подстрока начинается с последовательности букв “К”, ”л”, “а”, “р”.
- Подстрока заканчивается одним пробельным символом \s .
- Между последовательностью “К”, ”л”, “а”, “р” и пробелом \s могут встретиться любые символы .*, также их может не быть вовсе ?.
Рассмотренный пример, только, маленькая капля в море возможностей регулярных выражений.
Пришло время, перейти к практическому применению полученных знаний. Рассмотрим несколько полезных примеров регулярных выражений на PHP , но сначала скажем пару слов о функциях preg_match и preg_match_all, используемых в PHP при работе с регулярными выражениями.
Функцией preg_match удобно пользоваться, когда нужно найти только одно слово в тексте, удовлетворяющее шаблону, либо просто проверить наличие искомой последовательности.
Если ищется набор подстрок из текста, тогда нужно использовать preg_match_all, она возвращает массив со всеми найденными значениями.
Для того чтобы проверить в действии пример регулярного выражения со скороговоркой, скопируйте следующую функцию, и вызовите ее.
1 2 3 4 5 6 7 | function TestRegularFirst(){ $text='Карл у Клары украл кораллы, а Клара у Карла украла кларнет .'; echo '<strong>Пример:</strong> '.htmlspecialchars($text); preg_match_all("/(Клар.*?)\s/i",$text,$result); echo '<br/><strong>Результат:</strong> <pre>'.var_export($result[1],true).'</pre>'; } TestRegularFirst(); |
В результате работы функции должен вернуться массив:
1 2 3 4 5 | array ( 0 => 'Клары', 1 => 'Клара', 2 => 'кларнет', ) |
Советую поэкспериментировать с изменением шаблона, попробуйте например, заключить в квадратные скобки последовательность букв ”л”, “а”, “р”.
/(К[лар].*?)\s/i
В этом случае, получим массив:
1 2 3 4 5 6 7 8 9 | array ( 0 => 'Карл', 1 => 'Клары', 2 => 'крал', 3 => 'Клара', 4 => 'Карла', 5 => 'крала', 6 => 'кларнет', ) |
Если проанализировать вывод, то можно понять, что логика шаблона теперь учитывает не только четкую последовательность заключенных в квадратные скобки букв, но и их всевозможные комбинации.
Зная все нюансы регулярных выражений на PHP можно создать очень мощный шаблон для парсинга строк, текстов, сайтов, каталогов с продукцией, и т.д. Обо всем сложно рассказать в одной статье, поэтому, пока просто выложу таблицу с полезной информацией о метасимволах, которые используются в шаблонах.
Таблица метасимволов
Метасимвол | Значение |
---|---|
\d | Цифра (0-9) |
\D | Не цифра (любой символ кроме символов 0-9). |
\s | Пустой символ (обычно пробел и символ табуляции). |
\S | Непустой символ (все, кроме символов, определяемых метасимволом \s). |
\w | Все буквы, все цифры и знак подчеркивания (‘_’). |
\W | Все, кроме символов, определяемых метасимволом \w. |
\n | Символ перевода строки. |
\r | Символ возврата каретки. |
\t | Символ табуляции |
\xhh | Вставка символа с шестнадцатиричным кодом 0xhh, например \x41 вставит латинскую букву ‘A’. |
^ | Начало строки. |
$ | Конец строки. |
| | Метасимвол выбора. |
* | Ноль или более символов. |
+ | Одно или более символов. |
? | Встречается один раз, либо ноль. |
{} | Квантификатор, указывает количество повторений метасимволов. {4,6} (От 4 до 6 повторений). |
\A | Начало строки. |
\Z | Конец строки. |
\z | Конец текста. |
\b | Граница слова. |
\B | Не граница слова. |
\G | Предыдущий успешный поиск. |
Таблица модификаторов
Модификатор | Описание |
---|---|
i | Шаблон становится регистронезависимым |
m | Метасимволы ‘^’ и ‘$’ указывают на начало и конец каждой строки а не всего текста. |
s | Метасимвол ‘.’ включает в свое определение перевод строки. |
u | Делает все количественные метасимволы «не жадными» . |
Таблица примитивных полезных шаблонов
Шаблон | Описание |
---|---|
[0-9A-Fa-f] | Цифра в шестнадцатеричной системе счисления. |
[02468] | Четная цифра. |
[^\d] | Все, кроме цифр. |
/\d\d\d/ | Трехзначное число. |
[^-0-9] | Любой символ, кроме минуса и цифры. |
/^[a-zA-Z0-9]+$/ | Строка состоящая только из букв латинского алфавита и цифр. |
[^\s] | Все что не пробел. |
[^\s.] | Все что не пробел и не точка. |
foo$ | Строка заканчивается на “foo”. |
(gif|jpg) | Означает как “gif” так и “jpeg”. |
^[a-zA-Z0-9_]{1,}$ | Любое слово, хотя бы одна буква, число или “_”. |
(^A-Za-z0-9) | Любой символ (не число и не буква). |
/b(word)b/ | выбор из строки слова “word”. |
Таблица сложных и полезных шаблонов
Шаблон | Описание |
---|---|
/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i | Проверка доменного имени. |
/A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z/ | Комплексная проверка пароля. Строка не менее шести символов, цифры, дефисы и подчеркивания, как минимум один символ верхнего регистра, один нижнего регистра и одна цифра. |
[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?[\ .A-Za-z0-9]{2,} | Проверка правильности email. |
/<title>(.*)</title>/ | Поиск заголовка страницы. |
^\d{1,2}([-. /])\d{1,2}\1\d{2,4}$ | Разбиваем дату на числа. |
(?:8|\+7)? ?\(?(\d{3})\)? ?(\d{3})[ -]?(\d{2})[ -]?(\d{2}) | Номер мобильного телефона. |
/.*?\./ | Получить расширение файла. |
/\.(?:exe|msi|dmg|bin|xpi|iso)$/i | Проверка расширения файла. |
/<a [^<>]*href=[\'»]([^\'»]+)[\'»][^<>]*>(((?!/si | Внешние ссылки. |
/^[0-9]{1,55}$/ | Является ли строка числом до 55 цифр. |
/([a-zA-Zа-яА-Я]+)/ | Разбирает текст на отдельные слова. |
/^.{1,10}$/ | Любая строка, содержащая от 1 до 10 символов. |
/<b>(.*)</b>/ | Произвольная последовательность символов, заключенная между тегами. |
Надеюсь приведенные таблицы помогут вам быстрее разобраться с вопросом: что такое регулярные выражения в PHP ? Не стоит откладывать процесс ознакомления с этим мощным механизмом в долгий ящик, ведь чем скорее вы разберетесь с регулярками, тем меньше будет уходить времени на придумывание сложных алгоритмов обработки текста.
Пример регулярного выражения в php
Пример проверки e-mail с помощью регулярных выражений. Очень часто появляется потребность использовать вот такую проверку:
1 2 3 4 5 6 7 | function email_check($email) { if (!preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9_.-]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i",trim($email))) { return false; } else return true; } |
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Комментарии
true
А вот в WP стоит норм проверка!
Спасибо. Хорошая статейка, очень помогла в осмыслении реулярных выражений на PHP.
Скобочку добавьте фигурную после else
Да вроде сходится все по скобкам.
он имеет в виду «else return true;»
можно писать:
«else { return true;}»
как с несколькими выражениями. Кстати, я всегда стараюсь так делать. «От греха подальше». 🙂
— Где «Начало текста»? 😉
Вы сами что пишите про «Модификатор «?
По этому надо писать:
^ Начало текста.
$ Конец текста.
— И про «Модификатор » ничего нет.
— в Dreamweaver-е я никак не мог найти как этот «Модификатор » 🙁
Я долго мучился с обработкой текста. (Dreamweaver-е готовил XML файл из word-овского документа)
Однозначно, Регулярные выражения в PHP круче!
Кстати я читал что можно и коментарий тоже добавить внутр выражения с помощью «(?# )»/ Но, правда не пробовал.
Комментарий в регулярных выражениях
Например:
preg_match(«/^
(1[-\s.])? # выборочно ‘1-‘, ‘1.’ or ‘1’
( \( )? # выборочно: открывающаяся скобка
\d{3} # код
(?(2) \) ) # если была открыта круглая скобка, закрыть
[-\s.]? # далее ‘-‘ или ‘.’ или пробел
\d{3} # первые 3 цифры
[-\s.]? # далее ‘-‘ или ‘.’ или пробел
\d{4} # последние 4 цифры
$/x»,$number);
Комментарии обеспечиваются с помощью \х в конце выражения
^ -Начало текста.
$ -Конец текста.
Подходят для поиска в одной строке, а не для поиска по содержимому текстового файлу.
В Dreamweaver-е использовать для парсинга текста, все равно что чесать левое ухо правой рукой через спину.
>Кстати я читал что можно и коментарий тоже добавить внутр выражения с помощью “(?# )”/ Но, правда не пробовал.
А зачем комментарий в регулярке?
Неа. если по правилам:
^ -Начало строки ввода.
$ -Конец строки ввода.
Это и есть в том числе «для поиска по содержимому текстового файлу.»
А по Вашему, получается:
z — Конец текста есть, но начало текста нет…
Когда надо пройти с помощи поиск замена несколько (даже десятки) раз текст введенный в ручную, почти без никаких правил, приходится «чесать левое ухо правой рукой» 😉
Программно такие файлы тяжело сделать структурным.
>А зачем комментарий в регулярке? — я тоже не знаю. 🙂
Но Dreamweaver сохраняет такие сложные выражения в файле. Вот там — надо.
Предлагаю сойтись на таком толковании метасимволов:
^ — начало строки
$ — конец строки
\A — начало текста
\Z — конец текста
Оказывается, Вы меня не понимаете, потому что Ваша защита срезает часть моих сообщений.
Модификатор m и s работают как переключатель способа поиска.
Если установлен Модификатор m будет как Вы сказали, но если Модификатор s указано, тогда:
^ -Начало строки ввода.
$ -Конец строки ввода.
А по умолчанию какой + не знаю. надо узнать методом «тыка» 😉
\A тоже что ^, но не зависит от флага MULTILINE
\Z тоже что $, но не зависит от флага MULTILINE
Отличная статья.Огромное спасибо
Кому интересно, то вот пример комментариев в регулярных выражениях _http://pcreonline.com/IHSQug-2/
Я всегда их использую для больших регулярных выражений, очень помогает кстати.
Спасибо, как раз у Вас нашел рабочий вариант регулярки для мейлов
так чтоб и . внасале/конце видела
и кирилицу и /=
Помогите разобраться с написанием выражения.
Имеется строка:
«яблоко красное и зеленое яблоко и еще одно красное яблоко и еще одно яблоко зеленое»
Я хочу проверить число совпадений ключевых словосочетаний.
«зеленое яблоко» «яблоко зеленое». Как уже видно ключевые слова одинаковые только изменился порядок.
Скопировал пример кода, но в результате в массив попадает только ‘Клары’ и ‘Клара'(((. кларнет «потерялся»??? Кстати на сервисе _http://pcreonline.com — так же нет кларнета…. Почему?
Ошибочка вышла.
Чтобы кларнет попал, надо модификатор u дописать:
/(Клар.*?)\s/iu
Спасибо Марк за быстрый ответ. Все получилось.
Марк, прошу помощи. Который день бьюсь над задачей с переносами строк:
2
3
4
5
6
7
8
9
10
<pl class="stats">
<pt>Текст 1</pt>
<tt>1234</tt>
<pt>Текст 2</pt>
<tt>тут тоже есть текст</tt>
</pl>
тут тоже полно всякого текста и еще больше тэгов...
Необходимо получить контент, который находится между .
Что я пробовал:
В таком случае забирается все, что находится и после .
Так я пытаюсь взять то, что НЕ .
Про другие попытки и говорить не буду. Подскажите, пожалуйста, логику.
Вообще, должен первый вариант работать. Попробуйте перед прогоном через регулярку вырезать из текста все символы переноса строк \r\n.
Mark, а не могли бы подсказать, как выйти из проблемы:
в огромной таблице базы интернет-магазина масса ссылок на собственный сайт вида
База взломана и начинена ссылками на чужие сайты, ссылки надо удалить. Рег.выражение «~http://(www.)?.+\.[a-z]{2,3}~is»; находит ссылки, а как исключить собственные ссылки в рег.выражении?
Не уверен на 100%, но можно попробовать подумать в этом направлении:
«~http://(www.)?.[^sitename]{0,X}+\.[a-z]{2,3}~is»
где sitename — ваш домен, а Х — число символов в домене.
Мне, в свою очередь, на первых этапах, да и для изучения работы регулярных выражений понравился этот сервис для новичков.
ну совсем не понимаю как это сделать
Распарсить при помощи regex следующий список машин по маркам и моделям:
AUDI 100
AUDI 80/90
OPEL VECTRA
OPEL ASTRA
VW GOLF II