Upload
others
View
13
Download
0
Embed Size (px)
Citation preview
ПетрГУ, 2017 1
Web-технологии
Регулярные выражения
Кулаков Кирилл Александрович
ПетрГУ, 2017 2
Введение
● Регулярное выражение - строка-шаблон, представляющая собой формальную запись для множества строк.
● Примеры:
– Winter - соответствует лишь строке
Winter– Goo+gle - соответствует строкам
Google, Gooogle, Goooogle ...
ПетрГУ, 2017 3
Стандарты регулярных выражений
● POSIX — Apache, MySQL, ...
● PCRE — Perl совместимые регулярные выражения
– шаблон заключен в разделители
– нет спец.функций поиска совпадений без учета регистра
– POSIX находит самое длинное совпадение слева, PCRE — самое первое
– разное определение символьного класса
ПетрГУ, 2017 4
Разделители
● Любой символ не являющийся буквой, цифрой, обратной косой чертой или каким-либо пробельным символом
● Часто используемыми разделителями являются косые черты (/), знаки решетки (#) и тильды (~)
● Примеры:
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%● Разделители не надо экранировать, внутри шаблона
разделитель экранируется
/http:\/\//
ПетрГУ, 2017 5
Метасимволы (вне [])
● \ общий экранирующий символ, допускающий несколько вариантов применения
● ^ декларирует начало данных (или строки в многострочном режиме)
● $ декларирует конец данных или до завершения строки (или окончание строки в многострочном режиме)
● . соответствует любому символу, кроме перевода строки (по умолчанию)
● [ начало описания символьного класса
● ] конец описания символьного класса
● | начало ветки условного выбора
● ( начало подмаски
● ) конец подмаски
● ? расширяет смысл метасимвола (, является также квантификатором, означающим 0 или 1 вхождение, также преобразует жадные квантификаторы в ленивые (смотрите повторение))
● * квантификатор, означающий 0 или более вхождений
● + квантификатор, означающий 1 или более вхождений
● { начало количественного квантификатора
● } конец количественного квантификатора
ПетрГУ, 2017 6
Метасимволы (внутри [])
● \ общий экранирующий символ
● ^ означает отрицание класса, допустим только в начале класса
● - означает символьный интервал
● Примеры:
[0-9]
[^0-9]
[a-z\\]
ПетрГУ, 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, либо ссылка на подмаску
ПетрГУ, 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 Любой символ, не образующий "слово"
ПетрГУ, 2017 9
Экранирующие последовательности
● Обратная косая черта ('\')
– определение некоторых формальных утверждений● \b граница слова● \B не является границей слова● \A начало данных (независимо от многострочного
режима)● \Z конец данных либо позиция перед последним
переводом строки (независимо от многострочного режима)
● \z конец данных (независимо от многострочного режима)
● \G первая совпадающая позиция в строке
ПетрГУ, 2017 10
Якоря, точка, альтернатива
● '^' - начало обрабатываемых данных
– первый в шаблоне / альтернативе● '$' - метасимвол конца строки
– последний в шаблоне / альтернативе
● '.' - любой символ кроме перевода строки
● '|' - разделение альтернативных масок
ПетрГУ, 2017 11
Символьные классы
● упаковывается в [ ]
● соответствует одиночному символу обрабатываемой строки
● инверсия с помощью ^ (первый символ) [^ab]
● - - диапазон символов [a-z]
● Можно использовать общие типы символов [\dABCDEF]
ПетрГУ, 2017 12
Символьные классы
● Нотация posix (поддерживается в PCRE): [:класс:]
– alnumбуквы и цифры
– alpha буквы
– ascii символы с кодами 0 - 127
– blank только пробел или символ табуляции
– cntrl управляющие символы
– digit десятичные цифры (то же самое, что и \d)
– graph печатные символы, исключая пробел
– lower строчные буквы
– print печатные символы, включая пробел
– punct печатные символы, исключая буквы и цифры
– spaceпробельные символы(почти то же самое, что и \s)
– upper прописные буквы
– word символы "слова" (то же самое, что и \w)
– xdigit шестнадцатеричные цифры
ПетрГУ, 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
ПетрГУ, 2017 14
Повторение
● Обозначение: {минимум,максимум} или {точно}
● Односимвольные квантификаторы
* эквивалентен {0,}
+ эквивалентен {1,}
? эквивалентен {0,1}● Ленивый квантификатор (*?)
/\*.*?\*/
ПетрГУ, 2017 15
Обратные ссылки
● Обозначение: \число
● если число < 10 то это всегда обратная ссылка
● ссылается на захватывающую подмаску
● соответствует результату а не подмаске
● ссылка на именованную подмаску: (?P=name) или \k<name> или \k'name' или \k{name}
● ссылка на относительную (и абсолютную) подмаску \g{число}
(foo)(bar)\g{-1} → foobarbar
ПетрГУ, 2017 16
Утверждения
● проверки касательно символов, идущих до или после текущей позиции сопоставления, без поглощений
● Синтаксис: (?= для положительных утверждений и с (?! для отрицающих утверждений
\w+(?=;) → слово; (без включения ;)● Предшествующий текст: (?<= для положительных
утверждений и (?<! для отрицающих
(?<!foo)bar → yabar
– (?<=\d{3})(?<!999)foo → 123foo
ПетрГУ, 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) нежадные квантификаторы
ПетрГУ, 2017 18
Установка внутренних опций
● Perl-последовательность, заключенная между символами "(?" и ")"
– действует на остаток выражения / подмаски
– отключение с помощью '-'● Пример:
– (?im-sx) устанавливает флаги PCRE_CASELESS, PCRE_MULTILINE и отменяет флаги PCRE_DOTALL и PCRE_EXTENDED
– /ab(?i)c/ совпадет только с "abc" и "abC"
– (a(?i)b)c совпадет только с 'abc' и 'aBc'
ПетрГУ, 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 — Разбивает строку по регулярному выражению
ПетрГУ, 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)) ...
ПетрГУ, 2017 21
Примеры
● Запрет использования любых символов, кроме букв русского и латинского алфавита, знака "_" (подчерк), пробела и цифр:
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$username)) {
echo "invalid username";
}
● Проверка адреса e-mail
if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$usermail)) {
echo "invalid mail";
}
ПетрГУ, 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
ПетрГУ, 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";