23
ПетрГУ, 2017 1 Web-технологии Регулярные выражения Кулаков Кирилл Александрович

Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 1

Web-технологии

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

Кулаков Кирилл Александрович

Page 2: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 2

Введение

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

● Примеры:

– Winter - соответствует лишь строке

Winter– Goo+gle - соответствует строкам

Google, Gooogle, Goooogle ...

Page 3: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 3

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

● POSIX — Apache, MySQL, ...

● PCRE — Perl совместимые регулярные выражения

– шаблон заключен в разделители

– нет спец.функций поиска совпадений без учета регистра

– POSIX находит самое длинное совпадение слева, PCRE — самое первое

– разное определение символьного класса

Page 4: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 4

Разделители

● Любой символ не являющийся буквой, цифрой, обратной косой чертой или каким-либо пробельным символом

● Часто используемыми разделителями являются косые черты (/), знаки решетки (#) и тильды (~)

● Примеры:

/foo bar/

#^[^0-9]$#

+php+

%[a-zA-Z0-9_-]%● Разделители не надо экранировать, внутри шаблона

разделитель экранируется

/http:\/\//

Page 5: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 5

Метасимволы (вне [])

● \ общий экранирующий символ, допускающий несколько вариантов применения

● ^ декларирует начало данных (или строки в многострочном режиме)

● $ декларирует конец данных или до завершения строки (или окончание строки в многострочном режиме)

● . соответствует любому символу, кроме перевода строки (по умолчанию)

● [ начало описания символьного класса

● ] конец описания символьного класса

● | начало ветки условного выбора

● ( начало подмаски

● ) конец подмаски

● ? расширяет смысл метасимвола (, является также квантификатором, означающим 0 или 1 вхождение, также преобразует жадные квантификаторы в ленивые (смотрите повторение))

● * квантификатор, означающий 0 или более вхождений

● + квантификатор, означающий 1 или более вхождений

● { начало количественного квантификатора

● } конец количественного квантификатора

Page 6: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 6

Метасимволы (внутри [])

● \ общий экранирующий символ

● ^ означает отрицание класса, допустим только в начале класса

● - означает символьный интервал

● Примеры:

[0-9]

[^0-9]

[a-z\\]

Page 7: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 7

Экранирующие последовательности

● Обратная косая черта ('\')

– снимает специальное значение c не буквенно-цифрового символа (\*, \\, ...)

– использование непечатных символов в видимой форме

\a символ оповещения, сигнал, (BEL, шестнадцатеричный код 07)

\cx "Ctrl+x", где x - произвольный символ

\e escape (шестнадцатеричный код 1B)

\f разрыв страницы (шестнадцатеричный код 0C)

\n перевод строки (шестнадцатеричный код 0A)

\r возврат каретки (шестнадцатеричный код 0D)

\R разрыв строки: совпадает с \n, \r и \r\n

\t табуляция (шестнадцатеричный код 09)

\xhh символ с шестнадцатеричным кодом hh

\ddd символ с восьмеричным кодом ddd, либо ссылка на подмаску

Page 8: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 8

Экранирующие последовательности

● Обратная косая черта ('\')

– указание общего типа символов● \d любая десятичная цифра● \D любой символ, кроме десятичной цифры● \h любой горизонтальный пробельный символ (начиная с версии PHP

5.2.4)● \H любой символ, не являющийся горизонтальным пробельным символом

(начиная с версии PHP 5.2.4)● \s любой пробельный символ● \S любой непробельный символ● \v любой вертикальный пробельный символ (начиная с версии PHP 5.2.4)● \V любой символ, не являющийся вертикальным пробельным символом

(начиная с версии PHP 5.2.4)● \w Любой символ, образующий "слово"● \W Любой символ, не образующий "слово"

Page 9: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 9

Экранирующие последовательности

● Обратная косая черта ('\')

– определение некоторых формальных утверждений● \b граница слова● \B не является границей слова● \A начало данных (независимо от многострочного

режима)● \Z конец данных либо позиция перед последним

переводом строки (независимо от многострочного режима)

● \z конец данных (независимо от многострочного режима)

● \G первая совпадающая позиция в строке

Page 10: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 10

Якоря, точка, альтернатива

● '^' - начало обрабатываемых данных

– первый в шаблоне / альтернативе● '$' - метасимвол конца строки

– последний в шаблоне / альтернативе

● '.' - любой символ кроме перевода строки

● '|' - разделение альтернативных масок

Page 11: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 11

Символьные классы

● упаковывается в [ ]

● соответствует одиночному символу обрабатываемой строки

● инверсия с помощью ^ (первый символ) [^ab]

● - - диапазон символов [a-z]

● Можно использовать общие типы символов [\dABCDEF]

Page 12: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 12

Символьные классы

● Нотация posix (поддерживается в PCRE): [:класс:]

– alnumбуквы и цифры

– alpha буквы

– ascii символы с кодами 0 - 127

– blank только пробел или символ табуляции

– cntrl управляющие символы

– digit десятичные цифры (то же самое, что и \d)

– graph печатные символы, исключая пробел

– lower строчные буквы

– print печатные символы, включая пробел

– punct печатные символы, исключая буквы и цифры

– spaceпробельные символы(почти то же самое, что и \s)

– upper прописные буквы

– word символы "слова" (то же самое, что и \w)

– xdigit шестнадцатеричные цифры

Page 13: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 13

Подмаски

● ограничиваются круглыми скобками (могут быть вложенными)

● локализирует набор альтернатив

cat(aract|erpillar|) ● указывает на необходимость захвата подстроки

the ((red|white) (king|queen)) → строки "red king", "red" и "king", с номерами 1, 2 и 3 соответственно.

● отключение захвата '(?:'

(?i:saturday|sunday)● именованные подмаски с помощью синтаксиса

(? P<name>pattern)

● перенумерация совпадений '(|:'

– (?|(Sat)ur|(Sun))day → Sat и Sun получат номер 1

Page 14: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 14

Повторение

● Обозначение: {минимум,максимум} или {точно}

● Односимвольные квантификаторы

* эквивалентен {0,}

+ эквивалентен {1,}

? эквивалентен {0,1}● Ленивый квантификатор (*?)

/\*.*?\*/

Page 15: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 15

Обратные ссылки

● Обозначение: \число

● если число < 10 то это всегда обратная ссылка

● ссылается на захватывающую подмаску

● соответствует результату а не подмаске

● ссылка на именованную подмаску: (?P=name) или \k<name> или \k'name' или \k{name}

● ссылка на относительную (и абсолютную) подмаску \g{число}

(foo)(bar)\g{-1} → foobarbar

Page 16: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 16

Утверждения

● проверки касательно символов, идущих до или после текущей позиции сопоставления, без поглощений

● Синтаксис: (?= для положительных утверждений и с (?! для отрицающих утверждений

\w+(?=;) → слово; (без включения ;)● Предшествующий текст: (?<= для положительных

утверждений и (?<! для отрицающих

(?<!foo)bar → yabar

– (?<=\d{3})(?<!999)foo → 123foo

Page 17: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 17

Модификаторы шаблонов

● Следуют после последнего разделителя

● i (PCRE_CASELESS) регистронезависимость

● m (PCRE_MULTILINE) многострочные строки

● s (PCRE_DOTALL) точка включает перевод строк

● x (PCRE_EXTENDED) игнорирование пробелов

● e (PREG_REPLACE_EVAL) заменяемая строка есть PHP код (устарела с PHP 5.5+, удалена в PHP 7+)

● A (PCRE_ANCHORED) соответствие заякоренному шаблону

● D (PCRE_DOLLAR_ENDONLY) $ есть окончание данных

● S доп.анализ шаблона для ускорения

● U (PCRE_UNGREEDY) нежадные квантификаторы

Page 18: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 18

Установка внутренних опций

● Perl-последовательность, заключенная между символами "(?" и ")"

– действует на остаток выражения / подмаски

– отключение с помощью '-'● Пример:

– (?im-sx) устанавливает флаги PCRE_CASELESS, PCRE_MULTILINE и отменяет флаги PCRE_DOTALL и PCRE_EXTENDED

– /ab(?i)c/ совпадет только с "abc" и "abC"

– (a(?i)b)c совпадет только с 'abc' и 'aBc'

Page 19: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 19

Функции

● preg_filter — Производит поиск и замену по регулярному выражению

● preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

● preg_last_error — Возвращает код ошибки выполнения последнего регулярного выражения PCRE

● preg_match_all — Выполняет глобальный поиск шаблона в строке

● preg_match — Выполняет проверку на соответствие регулярному выражению

● preg_quote — Экранирует символы в регулярных выражениях

● preg_replace_callback_array — Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова

● preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции

● preg_replace — Выполняет поиск и замену по регулярному выражению

● preg_split — Разбивает строку по регулярному выражению

Page 20: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 20

Примеры

● Получить расширение файла

preg_replace("/.*?\./", '', 'photo.jpg');

● Взять то, что находится между тегами <title> и </title>

if (preg_match('|<title.*?>(.*)</title>|sei', $str, $arr)) $title = $arr[1];

else $title='';

● является ли переменная числом

if (!preg_match("|^[\d]+$|", $var)) ...

Page 21: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 21

Примеры

● Запрет использования любых символов, кроме букв русского и латинского алфавита, знака "_" (подчерк), пробела и цифр:

if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$username)) {

echo "invalid username";

}

● Проверка адреса e-mail

if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$usermail)) {

echo "invalid mail";

}

Page 22: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 22

Примеры

● Проверка имени файла

if (preg_match("/(^[a-zA-Z0-9]+([a-zA-Z\_0-9\.-]*))$/" , $filename)==NULL) {

echo "invalid filename";

}

● Проверка расширения файла (Архивы (zip, rar, ...)

/\.(?:z(?:ip|[0-9]{2})|r(?:ar|[0-9]{2})|jar|bz2|gz|tar|rpm)$/i

Page 23: Web-технологииkulakov/courses/php/lectures/12.regexp.pdf · PCRE — Perl совместимые регулярные выражения – шаблон заключен

ПетрГУ, 2017 23

Примеры

● Является ли строка числом, длиной до 77 цифр:

if (preg_match("/^[0-9]{1,77}$/",$string)) echo "ДА";

● Состоит ли строка только из букв, цифр и "_", длиной от 8 до 20 символов:

if (preg_match("/^[a-zа-я0-9_]{8,20}$/",$string)) echo "yes"; else echo "no";

● Проверка повторяющихся символов

if (preg_match("/(.)\\1\\1/",$string)) echo "found triple"; else echo "no";