PHP

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

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

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

strpos() – Возвращает подстроку в строке.
substr() -Возвращает заданный участок строки.
strcmp() - Сравнивает две строки.
str_replace() - Заменяет в строке все вхождения одной подстроки на другую подстроку.
explode() – разбивает строку в массив по заданному разделителю
strip_tags() – Удаляет из строки все HTML тэги.
strtolower() – Перевод в нижний регистр.
strtoupper() – Перевод в верхний регистр.
trim() – Удаляет (” “, \n, \r, \t) символы в начале и в конце строки.
HtmlSpecialChars() – Заменяет специальные символы на их HTML эквиваленты.
convert_cyr_string() – Преобразует русский текст из одной кодировки в другую.

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

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

wikipedia.org


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

Предположим, у нас имеется строка:

Карл у Клары украл кораллы, а Клара у Карла украла кларнет .
Если применить к этой известной скороговорке регулярное выражение вида:
/(Клар.*?)\s/i

то мы получим три слова соответствующих данному шаблону: “Клары”, “Клара”, и “кларнет”.

На первый взгляд, запись регулярного выражения выглядит устрашающе, но как говорится: «Не так страшен черт, каким его малюют!».

Сейчас я вам объясню принцип формирования шаблона для регулярного выражения.

Первое, что необходимо понять: не все символы в нашем наборе относятся к сути описания шаблона! Посмотрите внимательно на следующие регулярные выражения:
/(Клар.*?)\/i
~(Клар.*?)\s~i
#(Клар.*?)\s#i

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

Последним символом в нашем регулярном выражении стоит латинская буква i, наличие которой свидетельствует о том, что шаблон будет регистронезависимым. Если убрать этот модификатор, то в результате приведенного выше примера окажется не три слова, а два: “Клары” и “Клара”.

Откинув из нашего выражения разделители и служебные модификаторы, мы получим чистый шаблон регулярного выражения:
(Клар.*?)\s

Под действие данного шаблона попадут все подстроки в тексте, которые отвечают следующим правилам:

Подстрока начинается с последовательности букв “К”, ”л”, “а”, “р”.
Подстрока заканчивается одним пробельным символом \s .
Между последовательностью “К”, ”л”, “а”, “р” и пробелом \s могут встретиться любые символы .*, также их может не быть вовсе ?.
Рассмотренный пример, только, маленькая капля в море возможностей регулярных выражений.

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

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

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

Для того чтобы проверить в действии пример регулярного выражения со скороговоркой, скопируйте следующую функцию, и вызовите ее.
    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();

В результате работы функции должен вернуться массив:
array (
0 => 'Клары',
1 => 'Клара',
2 => 'кларнет',
)

Советую поэкспериментировать с изменением шаблона, попробуйте например, заключить в квадратные скобки последовательность букв ”л”, “а”, “р”.
/(К[лар].*?)\s/i

В этом случае, получим массив:
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}\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 с помощью регулярных выражений. Очень часто появляется потребность использовать вот такую проверку:
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;
}
Теги:
Регулярные выражения
Добавлено: 29 Сентября 2013 07:59:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...