Авто   Интересная история   Искусство   Карьера   Мастер   Недвижимость   Оружие   Подольск   Реклама   «Деловой Подольск»  
Содержание   А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

Шерлок Холмс спешит на помощь вебпрограммисту или регулярные выражения на пальцах

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

Введение.

Каждый веб-программист сталкивался с задачей, когда в произвольном тексте нужно найти какие-то данные по какому-то закону, проверить данные, которые поступили от пользователя, подвергнуть найденные данные сложной модификации. Можно изобретать велосипед, а можно использовать средства, которые используют программисты всего мира. Иной раз кажется, что профи пользуются какими-то инструментами, приемами, которые доступны только им. Разочарую читателя, что профи используют те же средства и инструменты, что и вы, только разница состоит в том, что они ими умеют пользоваться и умеют выбирать, какой инструмент стоит использовать в конкретном случае.
Данный материал призван помочь программистам решать насущные задачи при помощи регулярных выражений. Я постараюсь описать самые основы использования этого инструмента, чтобы вы не смотрели на комбинацию подобную этой:
/^(?:http://)?[-0–9a-z._]*.w{2,4}[:0–9]*$/
как баран на новые ворота.

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

Часть 1.
Где мы видели шаблон? Пойдем к знакомой секретарше и спросим у нее. Правильно, ответ — шаблоны Microsoft Word! Чем отличается шаблон «Календарь» от шаблона «Изысканное резюме»? Данными и способом их подачи. Человек, который хотя бы раз видел и то и другое, без труда будет отличать календарь от резюме. Так почему тогда регулярные выражения пугают программиста? Ведь это почти то же самое! О чем думает человек, который видит календарь и знает что это такое, как он его узнает? Календарь — это документ, который разделен на блоки, каждый блок состоит из цифр, которые соответствуют дням месяца. Каждому месяцу соответствует только один блок, в месяце бывает не больше 31 дня, в феврале не бывает больше 28 (за исключением високосного года), дни, которым соответствует день недели воскресенье или государственный праздник выделены красным, можно продолжить систематизировать данные дальше, указав месяцы в которых ровно 30 и 31 день. Что мы сделали? Мы создали описание календаря, по-другому, мы описали данные, найдя которые в произвольном тексте, можно с определенной уверенностью сказать, что перед нами календарь. Подобное описание я называю шаблоном в контексте разговора о регулярных выражениях.
Грядет день, когда программист будет говорить компьютеру, какую он хочет написать программу, а компьютер будет ее писать, но пока что программисту приходится трудиться самому. Т.е. если я скажу, что ищу отрывок текста, который удовлетворяет описанию календаря, то в наше время компьютер меня не поймет. Садитесь поудобней, ибо если гора не идет к Магомету, то Магомету идет к горе. Как все программисты к горе пойдем сидя перед монитором. Наша задача — научиться описывать данные, которые мы хотим найти, в понятной компьютеру форме. А что вы еще не умеете? Стыдно! Это тоже умеет каждая секретарша. Надеюсь, что такое командная строка программисту объяснять не надо. Start=>Run=>cmd. Наберем в командной строке слово dir
Вот, что я получил:
C:Documents and SettingsAdministrator>dir
Volume in drive C has no label.
Volume Serial Number is 3CC6–6445

Directory of C:Documents and SettingsAdministrator

13.10.2003 18:03 <DIR> .
13.10.2003 18:03 <DIR> ..
18.07.2003 21:55 <DIR> .java
18.07.2003 21:54 <DIR> .javaws
18.07.2003 21:55 <DIR> .jpi_cache
15.10.2003 16:33 694 .plugin141.trace
05.10.2003 11:40 <DIR> Desktop
16.10.2003 13:08 <DIR> Favorites
08.10.2003 16:42 <DIR> My Documents
18.08.2003 20:51 <DIR> Start Menu
04.07.2003 21:24 <DIR> WINDOWS

1 File(s) 694 bytes
10 Dir(s) 2 162 040 832 bytes free

Знакомо? Естественно! Считайте, что вы уже умеете пользоваться регулярными выражениями, осталось только совершенствовать свои навыки. Что вы сделаете, если файлов и директорий много, а вам нужно проверить только те, которые вас интересуют непосредственно? Вы попробуете уменьшить количество выводимых данных, указав условие поиска, описав данные, которые хотите получить. Обратите внимание, что нужно описывать данные, а значит, вы стоите на пороге создания шаблона. Допустим, нас интересуют все файлы и директории, которые имеют название, которое имеет в себе слово java. Уверен, что вы думаете так же, как и я и получаете вот такой результат:


C:Documents and SettingsAdministrator>dir *java*
Volume in drive C has no label.
Volume Serial Number is 3CC6–6445

Directory of C:Documents and SettingsAdministrator

18.07.2003 21:55 <DIR> .java
18.07.2003 21:54 <DIR> .javaws

0 File(s) 0 bytes
2 Dir(s) 2 161 618 944 bytes free
Попробуем перевести строку

dir *java*
на русский язык:
Найти и показать все файлы и директории в текущей директории, в названии которых присутствует слово java.

Вроде правильно, а вот и нет! Понимание регулярных выражений заключается в первую очередь в правильном описании закона совпадения (либо несовпадения), а также знания средств, которыми это описание можно «рассказать» компьютеру. Большинство статей в Сети занимаются решением второго пункта, и полностью опускают первый, они рассказывают программисту при помощи каких средств можно «рассказать» компьютеру свое описание интересующих данных. Почему я сказал, что описание неправильное? Потому что dir java* отличается одним символом от dir *java*, но под описание русским языком тоже попадает, ведь слово «java» в названии присутствует?

Делаем вторую попытку описания строки
dir *java*
Найти и показать все файлы и директории в текущей директории (и до этого момента все идет правильно), название которых начинается на какой угодно символ, таких символов может быть сколь угодно (в том числе их может и не быть), но после них обязательно идут подряд символы «j», «a», «v», «a», после которых может идти какой угодно символ, этих символов может быть сколько угодно (а может вообще не быть).

Отличается? Еще как! Продолжаем учиться описывать данные, которые мы хотим найти. Ищем командой dir, работаем с командной строки. Но задание усложним. Теперь я дам описание данных, которые хочу найти, а вы попробуете это сделать, все инструменты вам знакомы.
Найти и показать все файлы и директории в текущей директории, название которых начинается на какой угодно символ, таких символов может быть сколько угодно (а может не быть вообще), но после них обязательно идет символ «j», после которого снова идет любое количество каких угодно символов, но в конце названия стоят подряд символы «w» и «s».

Если вы читали внимательно, то без труда введете:
dir *j*ws

и получите ответ:
C:Documents and SettingsAdministrator>dir *j*ws
Volume in drive C has no label.
Volume Serial Number is 3CC6–6445

Directory of C:Documents and SettingsAdministrator

18.07.2003 21:54 <DIR> .javaws

0 File(s) 0 bytes
1 Dir(s) 2 161 504 256 bytes free

Просто? Еще бы! А теперь представьте, что я хочу найти не сколько угодно, а определенное количество каких угодно символов. Для этого используется символ «?» (знак вопроса). Вот и задача:
Найти и показать все файлы и директории в текущей директории, название которых начинается на какой угодно символ, таких символов может быть сколько угодно, но после них обязательно идет символ «j», после которого идет ровно четыре любых символа, а после них стоят подряд символы «w» и «s».

Ее решение:
dir *j??ws

C:Documents and SettingsAdministrator>dir *j?ws
Volume in drive C has no label.
Volume Serial Number is 3CC6–6445

Directory of C:Documents and SettingsAdministrator

18.07.2003 21:54 <DIR> .javaws

0 File(s) 0 bytes
1 Dir(s) 2 161 504 256 bytes free

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

Часть 2.

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

Посмотрите, что обозначает символ «*» и символ «?». Первый означает любое количество любых символов, второй означает только один любой символ. Ну, если с количеством пока все понятно, то вот что означает «любой символ»? Спрашиваете – отвечаем! «Любой символ» означает в нашем контексте работы с командой dir из командной строки любой из литералов. А значит звездочка «*» означает «сколько угодно литералов», «?» означает один литерал. Понятно? Вроде. Понятно, но не совсем определени дано не совсем точно. А почему? Потому что когда я описывал данные для поиска командой dir, я писал примерно вот так:
на какой угодно символ, таких символов может быть сколь угодно (в том числе их может и не быть)
Звездочка «*» означает сколько угодно литералов, а равно и их отсутствие! Что это значит? Это значит, что литералов может быть сколько угодно, но для совпадения при поиске не требуется ни один! И это нужно понимать и запомнить.
Знак вопроса «?» означает, что литералов может быть только один! Т.е. на данной позиции может стоять только один литерал, не больше и не меньше!

Рассмотрим подробнее понятие литерал, немного с другой стороны. Что из этих двух символов литерал, а что метасимвол?
«j» «*»
Элементарно, Ватсон, «j» – литерал, «*» – метасимвол.
Зреет вполне логичный вопрос, а как отличил?

На логичный ответ даем логичный ответ. Мы знаем, что символы «*» и «?» имеют какое-то магическое действие, по крайней мере команда dir их воспринимает по-другому, не так как симоволы «j», «a», «v», «a». Вот мы и разделили все символы на два класса, один – литералы, второй – метасимволы. Мы точно знаем, что в класс литералов входят все символы латиницы a, b, c, d и так далее до z, а так же входят цифры 0, 1, 2 и так до 9. Т.е класс литералов мы разбили еще на подклассы. Вам не кажется, что мы уже слишком много знаем, чтобы до сих пор возиться с командной строкой? Пора уже попробовать свои знания.

Кратко итог второй части:
– обычные символы называются «литералами»;
– специальные символы называются «метасимволами»;
– литералы означают сами себя;
– метасимволы предназначены для описания диапазнона литералов, каких-то применимых к литералам условий, свойств литералов, их количества;
– все литералы можно классифицировать, собрав их вместе по какому-то признаку.


Часть 3.

Ну наконец-то этот автор перестал рассказывать байки про командную строку, а начал что-то говорить про то, ради чего собственно писалась статья, использование регулярных выражений в веб-программировании. Остановитесь и подумайте, все ли понятно в предыдущих двух частях? Если нет, прочтите их еще раз, проделайте все примеры, эксперементируйте! Читать часть 3 без понимания предыдущих частей не советую, потратите время зря.
Из великого и могучего языка PHP нам понадобится только одна функция:

preg_match()
Ее общий формат таков:
preg_match(“шаблон_поиска”, “строка_в_которой_проводится_поиск”, массив_с_результами_поиска)

Эта функция реализует обращение к механизму обработки регулярных выражений, поиск совпадения в строке и возврат совпадений в массив. Так. Стоять! Что значит обращение к механизму, поиск и возврат? Мы привыкли оперировать немного другими понятиями. Вернемся снова к команде dir. В ее состав входит какой-то механизм, который читает Ваш шаблон и ищет по нему файлы и директории в текущей директории, ведь так? Для простоты назовем этот механизм тоже механизмом обработки регулярных выражений. Представим себе, что названия файлов и директорий записаны в строку, шаблон поиска записан в другую строку, а результаты выводятся не на черный экран, а в массив, и для поиска информации о файлах и директориях мы используем не команду dir, а функцию PHP preg_match(). Все стало на свои места. Функция preg_match() передает шаблон для поиска и строку, в которой будем искать, механизму поиска совпадений (механизму обработки регулярных выражений), и обеспечивает вывод результатов поиска в массив. Вылитая команда dir! Теперь понятно, почему я в начале сказал, что вас не нужно учить пользоваться регулярными выражениями, вы уже знаете, как это делается, просто не осознаете сам факт. Ну вот, поздравляю, вы теперь осознаете и факт. На этом можно было бы и закончить, если бы возможности поиска в PHP ничем не отличались от возможностей команды dir. Но это не так, поэтому будем учиться дальше и будем читать

Колесниченко Сергей

23/01/2006  
дополнительно
как можно оптимизировать PHP-Nuke
Отрисовка связанного дерева с помощью XSLT - как с умом использовать XSLT и XPath
Регулярные выражения.
Когда и почему не следует использовать регулярные выражения
Регулярные выражения. Часть 3
Регулярные выражения. Часть вторая
Регулярные выражения. 1
Сверхдинамичные веб-интерфейсы
юю
юю
back home top
название
анонс:
текст:
примечание:
отправитель:   mail:

Для публикации принимаются интересные и полезные статьи, которые наверняка заинтересуют жителей города Подольска и Подольского района. Статьи размещаются в по тематическом разделам журнала: «Недвижимость», «Авто-Подольск», «История Подольска и его окрестностей», «Искусство», «Карьера», «Реклама», «Оружие», «Деловой Подольск» Наиболее интересные материалы публикуются в электронных изданиях и рассылках группы «podolsk.biz».

Подольск Адреса История Подольские Форумы Объявления Справочник Фото Журнал
Подольское городское информационное агенство podolsk.biz размещение сайтов о городе Подольск и Подольском районе. имя вида название.podolsk.biz, почтовые адреса вида название@podolsk.biz
Подольское агенство podolsk.biz

Отдел рекламы 8903 1347521

поиск по Подольску



Подольск   карта сайта   Реклама на «podolsk.biz»