php регулярные выражения конец строки
Учебник по PHP 4
Соответствие началу и концу строкиВ регулярном выражении можно указать, должно ли конкретное подвыражение встречаться в начале, в конце строки или и в начале и в конце строки. Символ ^ соответствует началу строки: Такое выражение соответствует любой строке, начинающейся с xy. Обратите внимание, что в этом случае символ ^ ставится за пределами выражения в скобках, к примеру: Это регулярное выражение соответствует любой строке, заканчивающейся на xy.
Если Вам нужна частная профессиональная консультация от авторов многих книг Кузнецова М.В. и Симдянова И.В., добро пожаловать в наш Консультационный Центр SoftTime. Регулярные выражения в PHP.Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «4<6>» (если, например, от шести до восьми цифр, тогда «2<6,8>«). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества: Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов. Набор символовНе пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов). КвантификаторКвантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора, фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис: Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:
На практике такие символы используются чаще, чем фигурные скобки. ЯкоряЭти символы должны стоять соответственно в самом начале и в самом конце строки. ЖадностьВопросительный знак выступает еще и как минимизатор квантификатора: Результат работы примера: Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:
Функции для работы с регулярными выражениямиpreg_greparray preg_grep (string pattern, array input [, int flags]) preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern. Параметр flags может принимать следующие значения: PREG_GREP_INVERT preg_matchint preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern flags может принимать следующие значения: Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки. Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее. Пример кодаПример кодаПример кодаpreg_match_allint preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]]) Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags. После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения. Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно): Пример кодаПример кодаВ случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER. Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки. Пример кодаПример кодаpreg_quotestring preg_quote (string str [, string delimiter]) Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться. В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’. Пример кодаПример кодаpreg_replacemixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией \$<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1. Результатом работы этого примера будет: Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject, в противном случае будет возвращен исходный текст subject. Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов. В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом. Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса. Пример кода: Замена по нескольким шаблонамЭтот пример выведет: Пример кода: Использование модификатора /eПример кода: Преобразует все HTML-теги к верхнему региструpreg_replace_callbackmixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit]) Пример кодаpreg_splitarray preg_split (string pattern, string subject [, int limit [, int flags]]) Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern. flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’): PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE Примеры кодаВ случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно: Регулярные выражения для чайниковЧто такое регулярные выражения? В народе: регэкспы, регулярки. Начнем // наша строка для испытаний Этот код выведет ‘1’. Потому что он нашел 1 (одно) вхождение шаблона в строке. Нахождение начала строки Пример выведет: Символ ^ сразу после первого разделителя указывает что выражение начинается сначала строки и НИКАК иначе. Что делать с регистром символов (строчные-прописные) Перепишем код, чтобы он искал строку ‘ABC’: Скрипт вернет: Все потому что поиск регистро-зависимый. Шаблон ‘abc’ не тоже самое что ‘ABC’. Теперь скрипт найдет паттерн ‘abc’. Также теперь будут попадать под шаблон Позже будет рассказано подробнее о модификаторах. Как указать в паттерне конец строки Результат скрипта: Потому что мы определили конец строки 89. Вот так. Мета символы Список мета символов в регулярных выражениях: Разберем все символы на примерах. // образец Результат скрипта: Что означают остальные мета символы Квадратные скобки [ ] обозначают «строковой класс». Символьный класс. Это просто набор символов, которые должны совпасть в искомой строке. Или как диапазон, разделенный символом «-«: Результат скрипта: Потому что preg_match() нашел совпадение. Здесь preg_match() нашел первое совпадение с шаблоном /[^b]/. Результат скрипта: Выведет все символы, которые НЕ совпадают с шаблоном «b». Так мы можем отфильтровать все цифры в строке: Результат скрипта: Шаблон [^0-9] расшифровывается как все НЕ включая цифры от 0 до 9. Продолжаете слушать нашу радиостанцию? Метасимвол Бэкслэш (\). // create a string Бэкслэш также ортодоксально используется в строках для указания специальных последовательностей: \n, \r и др. Еще он неймспейсы разделяет! Следующий символ «.» (точка) ака «полный стоп». `Точка` совпадает с любым символом кроме символов разрыва строки \r или \n. Ищем одиночный символ $string = ‘sex at noon taxes’ ; Результат скрипта: Да, да preg_match() нашел одно совпадение. Пример также сработает с sax, six, sox, sux, и s x, но не совпадет с «stix». Теперь попробуем найти \n. Результат скрипта: preg_match_all() нашел 4 совпадения разрыва строки «\n» потому что мы использовали флаг \s. Подробнее про флаге в разделе Спец Последовательностей.. // create a string Результат скрипта: Нашлось одно совпадение. В примере это один символ «h». Добрались до мета символа символа «+» Плюс почти тоже самое что и звездочка, за исключением того что плюс совпадает с ОДНИМ и БОЛЬШЕ символом. // create a string Результат скрипта: Потому что ни одного символа «h». Следубщий пациент Знак вопроса совпадет с НУЛЕМ или ОДНИМ вхождением символа или регулярным выражением, Например, телефонный номер в Австралии: 1234-5678. // create a string Результат скрипта: Фигурные скобки <> Указывает на количество совпавших символов или их интервал. // create a string Результат скрипта: Шаблон PHP 0-9(цифры от 0 до 9) <3>(три раза) совпал. Специальные последовательности Бэкслэш (\) используется для спец. последовательностей: Итак, используя последофательности (флаги) мы можем сократить наши регулярные выражения Результат скрипта: Мы нашли (preg_match_all) все цифры и буквы (\w) класса ( [] ). На следующем примере мы можем убедиться, что строка не содержит чисел. // create a string Метасимвол «.» (Точка, полный стоп) Совпадает один раз с любым символом (кроме разрыва строки) // create a string Результат скрипта: Конечно, код содержит хотябы один символ. Ранее была рассмотрена проблема нахождения символа разрыва строки, потому что «.» не совпадает с таким символом (\n). Для примера используем \n. Результат скрипта: preg_match() нашел 4 совпадения перевода строки \n. Теперь все вместе, хором Более сложные выражения. Настало время показательного «Hello World» скрипта. // a simple string Усложним задачу: попытаемся найти одновременно Hello или Jello в строке. // a simple string Хотя шаблон совпал, мы не видим какую имеено сроку мы нашли. // a simple string Модификаторы и утверждения Модификаторы изменяют поведения шаблонов регулярных выражений. Простой пример модификатора «i» // create a string Использование модификатора «s» Результат скрипта: «.» не находит символы разрыва строки, добавим модификатор «s» Результат скрипта: Разрывы строк позволяют нам использовать модификатор «m». Результат скрипта: Конечно регулярное выражение найдет совпадение. В примере используюся вместе модификаторы «i» и «m», их действие комбинируется. «x» модификатор позволяет составлять регулярное выражение на нескольких строках, // create our regex using comments and store the regex Код в пояснениях не нуждается, он просто демонстрирует как можно вставить комментарии и Модификатор «e» Спец млжификатор, который изменяет выполнение сопоставления шаблону. Ниже будет выделена целая секция для его описания. Модификатор «S» Этот модификатор позволяет нам проанализировать строку до сопостовления с шаблонами, Паттерн может успорить выполение шаблона в случае с множественными совпадениями. Результат скрипта: На практике модификатор используется достаточно редко. Модификатор границы слова (word boundary) «\b» Граница слова создается между двух «\b» модификаторов. $string = ‘eregi will not be available in PHP 6’ ; Результат скрипта: Мы пытаемся найти совпадение с паттерном «lab», которое находится внутри строки в слове «available». $string = ‘eregi will remain in the computer lab’ ; Результат скрипта: Мы видим что совпадение произошло с целым словом «lab». (\blab\b). Модификатор \B Этот модификатор относится к предыдущем, но \B не ставит условия гранц слова, а наоборот $string = ‘This lathe turns wood.’ ; Результат скрипта: $string = ‘The quick brown fox jumps over the lazy dog.’ ; Результат скрипта: В этот раз мы ничего не нашли, потому что «the» стоит на границе слова, а мы использовали модификатор \B. Чтобы отключить такую «жадность» регулярных выражений Новичкам желательно использовать этот модификатор по-умолчанию, чтобы не возникало конфузов. $string = ‘foobar foo—bar fubar’ ; Результат скрипта: Вычисление с preg_replace Приветствуем на сцене модификатор «e». Этот модификатор вычисляет заменяемый аргумент. $string = ‘We will replace the word foo’ ; Пример заменит в строке foo на bar. В таких простых заменах целесообразнее использовать функции обработки строк // строка с шаблонными переменными С модификатором переменные вычислятся после замены: Таким образом, модификатор «e» обладает потенциалом встроенного шаблонизатора. Заглядывание вперед (Look Aheads) Возможность регулярных выражений «заглянуть вперед» шаблона для определения дальнейших совпадений. Рассмотрим сначала заглядывание вперед с отрицанием. Обозначается в шаблоне символами «?!». $string = ‘I live in the whitehouse’ ; Результат скрипта: Потому что слово «white» следует за словом «house». $string = ‘I live in the white house’ ; Результат скрипта: Есть совпадение, потому что слово «white» не следует сразу же за словом «house» (как в «whitehouse») Позитивное/положительное заглядывание вперед «?=» $string = ‘This is an example eg: foo’ ; Результат скрипта: Код ищет паттерн «eg», стоящий перед «:» двоеточием. Заглядывание назад (Look Behinds) $string = ‘I live in the whitehouse’ ; Результат скрипта: Здесь мы нашли совпадение, потому что паттерн «house» сразу следует за паттерном «house». /*** a simple string ***/ Результат скрипта: Потому что отрицательное заглядывание не нашло шаблона «house» c шаблоном «white» в начале его. $string = ‘I live in the bluehouse’ ; Мы изменили «whitehouse» на «bluehouse» и теперь наша регулярка сработала, потому что /*** 4 x and 4 z chars ***/ /*** string of characters ***/ Чтобы сделать нежадным весь шаблон, используем модификатор «U». /*** string of characters ***/ Результат как в предыдущем примере. Важно заметить, что модификатор «U» не только делает поиск нежадным, он инвертирует поведение жадности квантификатора «?». /*** string of characters ***/ Результат скрипта: В этом мане было рассмотрено много регулярок и все они разделялись слэшем «/». Поэтому в качестве разделителя можно взять любой символ, например #, @, ^ и т.п. Примеры // the string to match against Поиск нескольких шаблонов // the string to match against Запомните, preg_match() возвращает только 0 или 1, и останавливается после первого успешного нахождения шаблона. Чит Шит Дополнения от меня Posix символьные классы Внутренние модификаторы шаблонов Модификаторы m, s, x, U, X, J могут использоваться внутри шаблона. Пример: Именованный «захват» Возможность регулярных выражений именовать ключи в результирующем массиве совпадений. Записывается: (? ), (?’name’) или (?P ). Результат скрипта: Замена через callback-функцию В php есть возможность указать функцию обратного вызова Данный код заменит все первые буквы в параграфах на заглавные. В php >= 5.3 callback-функцию можно записать в сокращенном виде
|