28.03.2024г.16:36
Добро пожаловать на DevelStudio.3dn.ru — Уникальное для DevelStudio!
ГлавнаяФорумУрокиПримерыИсходникиНов. СообщенияЗаказать исходникВаша ссылка
Форма входа
Мини-чат
Загрузка чата...
Отправить
Наши флудеры
Ник: Resh
Сообщений: 527
Администраторы
Resh
Ник: Slava_Uchiha
Сообщений: 232
Администраторы
Slava_Uchiha
Ник: Skryaga
Сообщений: 145
Друзья
Skryaga
Партнёры
Кто на сайте
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Пользователи
Гости сайта
Пользователи отсутствуют...

Cчетчики
Анализ интернет сайта
Счетчик тИЦ и PR
Уроки Урок 21. Учимся работать с регулярным выражением(preg_match)
Синтаксис регулярных выражений

Теперь самое интересное основа регулярных выражений - их синтаксис:

| - означает логическое "или".

#а|о# - шаблон ищет a, если не найдет, будет искать о.

ˆ - этот знак в шаблоне обозначает, чтобы в начале обязательно стояли следующие за ним символы.

#ˆп# - шаблон ищет п и найдет, если эта буква стоит первой.

$ - этот знак в шаблоне обозначает , чтобы в конце обязательно стояли предшествующие ему символы.

#т$# - шаблон ищет т и найдет, если он стоит последним.

. - точка в шаблоне обозначает, что шаблон совпадет с любым символом строки, кроме \n.

#.# - шаблон совпадет с любыми символами, кроме знака \n.

*- этот знак в шаблоне обозначает количество совпадений, это числитель ноль или более раз.
#а*# - шаблон ищет а и найдет только в том случае, если а будет находиться в строке ноль или более раз. То есть, совпадет с любой строкой и вернет ее.

+ - этот знак в шаблоне обозначает количество совпадений, это числитель 1 или более раз.

#п+# - такой шаблон ищет п и найдет, если п будет находиться 1 или более раз.
То есть, если "п" нет, то совпадения не будет. Если будет хотя бы одна буква "п", то совпадение будет.

? - этот знак в шаблоне обозначает количество совпадений, это числитель 0 или 1 раз.

#п?# - шаблон ищет п и найдет только в том случае, если п будет находиться 0 или 1 раз. То есть, если в тексте нету букв "п", совпадение будет. Если в тексте будет одна буква "п", совпадение также будет. А если букв "п" от двух и больше, то совпадения не будет.

{ } - эти знаки в шаблоне обозначают сколько раз должно быть совпадение.

? тоже самое, что и {0,1} - ноль или один раз;

* тоже самое, что и {0, } - ноль или более раз;

+ тоже самое, что и {1, } - один или более раз.

То есть, первая цифра обозначает минимум совпадений, последняя - максимум. Если цифра максимальных совпадений не указана, то она обозначает бесконечность. Например,{2, } обозначает, что должно быть 2 и более совпадений.

\ - обратный слеш в шаблоне обозначает подстановку.

#\.# - мы предварили точку обратным слешем и, теперь, наш шаблон будет искать точку, и совпадет только с ней в нашем тексте, а не со всеми символами, как было в последнем примере. То есть, обратный слеш служит для обозначения самих метасимволов, как обычных символов текста. Так же, все метасимволы надо предварять слешем для обозначения самих себя. Еще обратный слеш называют символом экранирования.
Подстановка метасимвола:
\\ \. \| \( \) \[ \ \] \{ \} \? \* \+ \ˆ \/ \# \!
Подстановка класса символов
\d- любой цифровой символ[0-9]

\D - любой не цифровой символ[Ր-9]

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

\S - любой не пробельный символ[ˆ\t\ \r\f\n]

\w - любой алфавитно-цифровой символ [a-zA-Z0-9_]

\W - любой не алфавитно-цифровой символ[ˆa-zA-Z0-9]

Кроме этого, классы символов можно обозначать так:

[[:alnum:]] - все алфавитно-цифровые символы[a-zA-Z0-9]

[[:alpha:]] - все алфавитные символы[a-zA-Z]

[[:blank:]] - символ табуляции и пробел[t ]

[[:cntrl:]]- все управляющие символы

[[:digit:]] - все десятичные цифры[0-9]

[[:graph:]] - все печатные символы, за исключением пробела

[[:lower:]] - все строчные буквы[a-z]

[[:upper:]]- все прописные буквы[A-Z]

[[:print:]] - все печатные символы

[[:punct:]]- все знаки препинания [\.,;:-\.,;:-]

[[:space:]] - все пустые символы

[[:xdigit:]] - все шестнадцатеричные цифры

Если вы поставите[ˆ[:alnum:]] - любой не алфавитно-цифровой символ, то есть это полная противоположность[[:alnum:]]. То есть, любой класс вы можете инвертировать посредством 'ˆ'.

Подстановка претензий

\b - на границе слова

\B - не на границе слова

\A - в начале строки

\Z - в конце строки

\z - в конце текста

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

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

i - игнорировать регистр

#шаблон#i будет искать шаблон, игнорируя регистр в тексте поиска.

s - метасимвол. соответствует и символу\n, то есть классу[\0-\xFF]

#шаблон#s будет искать шаблон, где . видит \n, то есть метасимвол точка будет так же возвращать и перевод каретки на новую строку.

U - минимизировать числитель, то есть искать как можно меньше совпадений.

#шаблон#U будет искать шаблон, с как можно меньшим совпадением раз. Если мы ставили в шаблоне#a?# - действие этого модификатора примерно такое же, как и минимизатора ? в самом шаблоне.

m - претензии ˆ и $ учитывают \n

#шаблон#m - если в шаблоне будут метасимволы ˆ и $, то претензия ˆ будет искать совпадение в начале строки, а претензия$ будет искать совпадение в конце строки.

D - претензия$ не учитывает \n
#шаблон#D - если в шаблоне есть метасимвол$,
претензия $ будет искать совпадение в фактическом конце текста, игнорируя переводы каретки на новую строку \n.

A - привязать шаблон к началу текста.
#шаблон#A - будет искать шаблон только в фактическом начале теста.

x - разрешить комментарии: пробел и #
#шаблон#x - здесь в шаблоне разрешены пробел и #, как комментарии, поэтому пробел и # надо предварять слешем, если только они не обозначают комментарии.
/слово
#комментарий
ищу/x

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

X - воспринимать неверную подстановку как ошибку.

S- предварительная оптимизация шаблона.

e - используется в функции preg_replace() для ее активации.
Функции в PHP для работы с регулярными выражениями


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

preg_match() - выполняет проверку на соответствие регулярному выражению;
preg_match_all() - выполняет глобальный поиск регулярного выражения в строке;
preg_replace() - выполняет поиск и замену по регулярному выражению.
preg_split()- разбивает строку по регулярному выражению.

Теперь разберем подробно все эти функции. Естественно, с примерами.
Функцияpreg_match()
Code
mixed preg_match ( string pattern, string subject [, array &matches [, int flags [, int offset]]] )


Ищет в заданном тексте subject совпадения с шаблоном pattern.
В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0]будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.
Параметр flags может принимать следующие значения:

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


Примеры


Пример #1. Поиск подстроки "develstudio" в тексте

Code
// Символ "i" после закрывающего ограничителя шаблона означает
// регистронезависимый поиск.
if (preg_match('/develstudio/i', 'DevelStudio.3dn.ru - Уроки, Исходники, Помощь и многое другое.')) echo 'Вхождение найдено.';
else echo 'Вхождение не найдено.';

Конечно же результат - этого примера - вывод на экран текста "Вхождение найдено."

Пример #2. Поиск слова "Уроки" в тексте

Code
/*
\b обозначает границы слова, следовательно, только изолированное вхождение слова "web" будет соответствовать маске, в отличие от "webbing","cobweb" и других слов, содержащих "web".
*/
if (preg_match('/\bУроки\b/i', 'DevelStudio.3dn.ru - Уроки, Исходники, Помощь и многое другое.')) echo "Вхождение найдено.";
else echo "Вхождение не найдено.";


Пример #3. Извлечение доменного имени из адреса

Code
// Извлекаем имя хоста из URL
preg_match('/^(http:\/\/)?([^\/]+)/i', 'http://develstudio.ru/', $matches);
$host = $matches[2];
// извлекаем две последние части имени хоста
preg_match('/[^\.\/]+\.[^\.\/]+$/', $host, $matches);
echo $matches[0];

Результатом выполнения будет develstudio.ru
Урок написал Resh спецально для Develstudio.3dn.ru
12 комментариев
9010 просмотров
автор: Resh
дата: 17.10.2011, 14:11
Ravi321
11.09.2017 14:45
Добрый день. Нужна помощь.
Есть:
foreach ($keywordlist as $key) { $iskeyworded+= preg_match('/('.mb_strtolower($key, 'UTF8').')/',mb_strtolower($name, 'UTF8')); };

Все это работает для сравнения строк из колонки базы данных - в тексте в файле, но сейчас находит слова даже если часть слова присутствует. 
Необходимо сделать чтобы было по точному слову, например:
- ищем слово ЛАК в тексте, но чтобы ЛАКИРОВАННАЯ МЕБЕЛЬ не находил. Только если есть слово ЛАК.
Заранее благодарен....
Ravi321
11.09.2017 14:21
Добрый день. Подскажите пожалуйста.
Есть:
foreach ($keywordlist as $key) { $iskeyworded+= preg_match('/('.mb_strtolower($key, 'UTF8').')/',mb_strtolower($name, 'UTF8')); };

Все это работает для сравнения строк из колонки базы данных - в тексте в файле, но сейчас находит слова даже если часть слова присутствует. 
Необходимо сделать чтобы было по точному слову, например:
- ищем слово ЛАК в тексте, но чтобы ЛАКИРОВАННАЯ МЕБЕЛЬ не находил. Только если есть слово ЛАК.
Заранее благодарен....
MasiZ
05.05.2012 21:39
Чет я не понял как это #а|о# в пример вставить. Можно пример пожалуйста))
Ghost_Ukr
26.01.2012 01:33
О все,нашел еще раз перечитал и нашел про обратный слеш.Спасибо за урок)
Resh
27.01.2012 16:41
не за что
Ghost_Ukr
26.01.2012 01:30
Можно ли как то сделать что бы не "читало" скобки?
if (preg_match('/\b1.2[FULL]\b/i', c("edit1")->text))
Должно найти(1.2[FULL]).Я уже все делал,скобки добавлял но походу оно все равно скобки не так читает(когда я писал без скобок например 1.2F у меня было без ошибок,А так оно выдает что значение лошь,хотя все верно.
Resh
08.12.2011 14:24
какие правила выше написаны обсолютно все названия этих символов
jallvar
23.11.2011 13:19
Спасибо большое. Всегда были проблемы с регулярными!
Resh
26.11.2011 21:39
не за что) happy
lifeviewer
17.10.2011 20:15
Навряддли он его выложит =/ Может я упрошу его выложить , я то понял что там надо , а вот человек уже примерно с моего сайта написали как сделать авторизацию и регистрацию =)
Slava_Uchiha
17.10.2011 18:57
Resh ты супер,спасибо огромное,терь жду урок по regDS
lifeviewer
17.10.2011 17:27
Дооооо вот это самый лучший и понятный урок !
Вы не можете добавлять комментарии

При копировании материалов → указывайте ссылку на источник!
DevelStudio.3dn.ru © 2011 Все права защищены. Используются технологии uCoz DevelStudio
Счётчики
Сегодня нас посетило
Показано 2 последних комментария из 252.
С помощью этого компонента можно прослушивать музыку в потоке TMusic v1.2 . дальше »
С помощью этого компонента можно прослушивать музыку в потоке TMusic v1.1 . дальше »
Мини-статистика
Всего зарегистрировано: 574
Постов на форуме: 2066
Тем на форуме: 452