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


Содержание

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

Nickolay.info. PHP. Регулярные выражения — это просто

Регулярные выражения — это просто

Введение

Попросту говоря, регулярные выражения (regular expressions, сокращенно regexp, regex) — это шаблоны, которые можно сопоставлять со строками. В отличие от обычного определения вхождения подстроки в строку, которое в PHP можно делать, например, с помощью функции strpos , шаблоны позволяют включать в искомое или заменяемое строковое выражение групповые символы (wildcards) — именно в этом их сила.

Регулярные выражения доступны не только в PHP, но и в большинстве современных языков и пакетов, работающих с текстом — от Perl, Javascript и .NET Framework до Microsoft Office, так что знать их полезно любому грамотному пользователю, не говоря уж о программистах. Однако, начинающих regexp’ы нередко пугают, а толстенные руководства наводят тоску (например, самая классическая и рекомендуемая книга — Mastering Regular Expressions автора Jeffrey Friedl).

Поэтому постараемся сказать обо всём предельно кратко и доступно.

В PHP доступно 2 типа регулярных выражений:

  • POSIX-совместимые (POSIX означает всего лишь Portable Operating System Interface for Unix) — в PHP под Windows доступны по умолчанию, под Unix можно установить при настройке конфигурации PHP с помощью ключа —with-regex
  • Perl-совместимые или PCRE (Perl Compatible Regular Expressions) — имеют синтаксические отличия, но считаются более быстрыми и мощными. Под Windows и Unix регулярные выражения PCRE доступны по умолчанию, именно на них мы будем ориентироваться в дальнейшем.

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

Сначала опишем основные специальные символы (символьные классы) регулярных выражений, приведя примеры по каждому из них.

^
Начало строки. Ставится перед символом или шаблоном, на который действует.
^а — строка начинается с » а «

$
Конец строки. Ставится после символа или шаблона, на который действует.
а$ — строка заканчивается на » а «

[]
В квадратных скобках указываются альтернативные символы, в строке может присутствовать любой из них.
PHP[345] может означать » PHP3 «, » PHP4 » или » PHP5 «

— внутри квадратных скобок
Символом «минус» (дефис) разделяются первый и последний символы последовательности, в строке может присутствовать любой символ от первого до последнего включительно. Разумеется, «последовательности символов» имеют смысл лишь относительно текущей кодировки. Например, в UTF-8 (Юникоде) и Windows-1251 (стандартная русифицированная Windows) русские буквы (кроме «ё») гарантированно имеют идущие подряд коды, в кодировках DOS и КОИ-8R это не так.
PHP[3-5] может означать » PHP3 «, » PHP4 » или » PHP5 «

^ внутри квадратных скобок
В строке допустимы любые символы, кроме указанных этим знаком.
[^A-C] означает любую цифру, или букву от » D » и далее по алфавиту и т.п.

|
Используется как разделитель для нескольких альтернативных шаблонов.
PHP4|PHP5 означает » PHP4 » или » PHP5 «

()
Круглые скобки определяют подшаблон, независимую составную часть основного шаблона. Полезно отдельные «части» строкового формата определять как отдельные подшаблоны.
(а)(б) означает » аб «, но как 2 подшаблона, а и б

.
Точка обозначает любой символ.
PHP. может означать » PHP3 «, » PHP4 «, » PHP5 » или » PHPA » и т.д.

\
Следующий после » \ » символ не считается специальным, иногда говорят, что » \ » экранирует идущий за ним символ.
\. означает символ точки, но не любой символ
\\ означает символ » \ «, но не управляющий символ

Перечислим ещё несколько полезных специальных символов, которые есть в PCRE-совместимых регулярных выражениях:
\s — пробел или табуляция или иной пробельный (space) символ;
\S — видимые символы, можно считать, что это всё, что не совпадает с \s ;
\w — в этот спецсимвол включены все символы, которые могут входить в слово (word), обычно [a-zA-Z_] , хотя это зависит от установленной локали, поддержки Юникода и т.п.;
\W — всё, что не входит в определение \w , то есть, [^a-zA-Z_] ;
\d — цифра (digit; специальный символ позволяет не писать символьный класс [0-9] );
\D — всё, что не является цифрой.

Квантификаторы

Самое важное — один символьный класс описывает только один символ, а когда символов много, применяются квантификаторы.

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

А если мы не поленимся указать квантификаторы, запись можно изменить:

А вот и сами квантификаторы:

?
Ноль или одно повторение предыдущего символа или выражения («ноль или один»).
аб? может означать » а » или » аб «

*
Ноль или более повторений предыдущего символа или выражения («ноль или много»).
аб* может означать » а » или » аб » или » абб » и т.д.
Часто используется последовательность .* для обозначения любого количества любых символов между двумя частями регулярного выражения.

+
Одно или более повторений предыдущего символа или выражения («хотя бы один», «один или много»).
аб+ может означать » аб » или » абб » или » аббб » и т.д.


Ищется ровно n вхождений предыдущего символа или шаблона.
[0-9] <3>— три любых идущих подряд цифры


Такая конструкция в фигурных скобках обозначает минимальное ( min ) и максимальное ( max ) число вхождений, если опущен минимум min (но не запятая), он предполагается равным 0 , если опущен максимум max (но не запятая), он предполагается равным infinite (бесконечности).
a <1,3>может означать » а » или » аа » или » ааа »
a <1,>может означать цепочку из букв » а » любой длины, но не менее одного символа
a <,3>может означать цепочку из букв » а » в количестве не более трёх (обратите внимание, ноль букв » а » тоже попадает под это выражение!)

Манипулируя указанными выше символьными классами, специальными символами и квантификаторами, можно составить много полезных примеров, скажем, таких:
[^\s] — любой символ, который не является пробельным;
[^\s]+ — минимум один символ, который не является пробельным;
\s+ — минимум один пробельный символ;
^\d+$ — строка является числом из одной и более цифр ( ^ вне квадратных скобок — не исключение символов, а начало строки; обратите также внимание, что здесь вся строка должна соответствовать шаблону — так как в него включены метки начала ^ и конца $ строки);
^[a-zA-Z0-9]+$ — латинские буквы и цифры, минимум один символ;
^[a-zа-я0-9_]<1,8>$ — строка только из латинских или русских букв, цифр и подчёркивания от 1 до 8 символов длиной (игнорирование регистра обычно можно указать с помощью описанных ниже модификаторов шаблонов);
[^(\x7F-\xFF)|(\w)|(\s)] — исключаем символы с кодами 127 и больше (как видите, в регулярных выражениях можно писать 16-ричные коды символов в стиле языка Си), разрешаем печатаемые и пробельные символы.

Стандартные функции для работы с регулярными выражениями

Как всё это использовать в PHP? Да очень просто, нам понадобится всего несколько стандартных функций:

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

Посмотрим подробнее на каждую из этих функций.

Функция ищет в заданном тексте $subject совпадения с шаблоном $pattern , если задан необязательный третий параметр — массив $matches , то пишет в него результаты поиска.

Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первому подшаблону (если он есть), и так далее.

Возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match прекращает свою работу после первого найденного совпадения.

Приведём пример, выбирающий из произвольной строки номер российского сотового телефона вида +7XXXXXXXXXX или 8XXXXXXXXXX , где X — цифры:

В элементе $matches[0] будет содержаться весь найденный номер, в $matches[1] — первый подшаблон ( +7 или 8 ), а в $matches[2] — второй подшаблон (10 цифр сотового номера).

Попробуйте улучшить этот пример, разрешив между группами цифр шаблона пробелы или тире, так чтоб находилось +7 XXX XXX XX XX или 8-XXX-XX-XX-XXX .

Обратим внимание на один нюанс: шаблон поиска в первом аргументе функции не только взят в «двойные кавычки», как любая интерпретируемая строка PHP, но и заключён в символы-ограничители / . / , во-первых, эти ограничители нужны функциям, чтобы они могли «понять» шаблон (кроме / . / используют также # . # ), во-вторых, это делается потому, что после закрывающего символа / могут ставиться так называемые модификаторы шаблонов, уточняющие их действие:

  • i — игнорировать регистр символов;
  • m — обрабатывать текст как многострочный;
  • s — метасимвол «точка» в шаблоне соответствует всем символам, включая перевод строк (без модификатора s — всем, за исключением переводов строк);
  • x — игнорировать неэкранированные пробелы, символы табуляции и пустой строки в шаблоне;
  • e — только для preg_replace — после выполнения стандартных подстановок в заменяемой строке PHP интерпретирует её как код и использует результат для замены искомой строки;
  • u — включает совместимость с Юникодом (UTF8).

Есть ещё несколько модификаторов, но они используются реже.

Рассмотрим остальные функции, применяемые для поиска в строках по шаблонам regexp’ов.

В отличие от предыдущей функции, третий аргумент здесь обязателен. Функция preg_match_all выполняет глобальный поиск шаблона $pattern в строке $subject и помещает результаты поиска в массив $matches .

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

Чтобы понять, как это работает, поищем сначала что-нибудь простое, например, целые числа с допустимым, но необязательным знаком «+» или «-» перед первой цифрой.

Первый вопрос по нашему примеру — почему мы выводили элементы $matches[0][$i] ? Дело в том, что после поиска элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первого подшаблона, и так далее.

Таким образом, $matches[0][0] — это первое найденное число, $matches[0][1] — второе и т.д.

Вместо $res можно было воспользоваться для определения количества найденных чисел выражением count($matches[0]) .

Второй вопрос — почему наш поиск «неожиданно» нашёл в строке $numbers целых 6 чисел?

В самом деле, мы ведь не указали, что цифра должна начинаться после пробела или с начала строки?

Но писать шаблон вроде » / [\+|-]?[\d]+/ » (добавлен пробел перед знаком числа) не стоит — потеряем число 11 , которое является первым в строке. Пытаться использовать символ » ^ » (начало строки) тоже не будем — тогда есть риск потерять все остальные числа.

Вместо этого попытаемся исключить символы, которых непосредственно перед целым числом заведомо не может быть — потому что они есть только в вещественных числах, например, десятичную точку и букву e (используется в так называемой экспоненциальной записи вещественных чисел, где 2e4 означает 2*10 4 ): » /[^.eE][\+|-]?[\d]+/ «

Такой шаблон найдёт в строке $numbers ровно 4 числа:

Легко заметить, что и этот шаблон несовершенен. Например, в строке

(в экспоненциальной записи числа после E или e можно использовать знак » — » или » + «, показывающий, на отрицательную или положительную степень числа 10 нужно умножить основание) наш шаблон найдёт 2 цифры: 2 и -4 .

Можно и дальше изощряться в улучшении шаблона, но лучше соблюдать простой принцип — начинать с начала, а не с конца, как сделали мы только что.

Давайте перевернём задачу с головы на ноги. У нас есть строки формата [знак][цифры][остальное] , нам нужно оставить только [знак][цифры] .

Вынесем [остальное] в отдельный подшаблон, и будем печатать не $matches[0][$i] , а $matches[1][$i] . Часть [знак][цифры] легко опишется подшаблоном ([\+|-]?[\d]+) , а часть [остальное] может иметь вид ([^\s,]*) (любые символы, за исключением пробельных и запятой — последнее на случай, если 2 целых числа разделены запятой без пробела: 1,2 ).

Получаем следующий код:

Он найдёт то, что мы вправе и ожидать для строки $numbers :

Поведение функции preg_match_all можно изменить, если передать ей четвёртым параметром константу PREG_SET_ORDER . Тогда $matches[0] будет содержать первый набор вхождений, $matches[1] — второй набор вхождений, и т.д.

То есть, элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и т.д. В нашем цикле изменится лишь порядок обращения к элементам массива $matches :

Наконец, указав вместо PREG_SET_ORDER флаг PREG_OFFSET_CAPTURE , мы могли для каждой найденной подстроки возвращать её позицию в исходной строке.

Этот флаг полностью изменит формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение.

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

Функция ищет в строке $subject совпадения с шаблоном $pattern и заменяет их на $replacement .

При разборе этой функции полезными окажутся подмаски, соответствующие заключённым в круглые скобки частям шаблона (подшаблонам). Подмаски последовательно нумеруются, начиная с 1, подмаска с номером 1 может обозначаться в строке шаблона как \\1 либо как $1 , причём последний вариант предпочтительней. Подмаска \\0 или $0 соответствует нахождению всего шаблона.

Если непосредственно за подмаской в строке $replacement должна следовать цифра, во избежание путаницы подмаска изолируется фигурными скобками: \$<1>0 соответствует первой подмаске и следующей за ней цифре 0 , в противном случае \$10 будет воспринято как десятая подмаска.

Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено изменённое значение $subject , в противном случае будет возвращен исходный текст $subject .

Приведём пример, в котором из записи чисел в экспоненциальной форме убирается «всё лишнее», то есть, предшествующие знаки » + » или » — «, дробная часть числа, если она есть, а также вся часть, начиная с буквы » e » или » E «. Наш предыдущий шаблон для удобства мы перепишем так, чтобы он непосредственно отражал структуру числа в экспоненциальной форме:

  • ([\+|\-]?) — знак » + » или » — » перед числом, он же $1
  • (\d+) — цифры целой части числа, $2
  • (\.?) — десятичная точка, $3
  • (\d*) — цифры дробной части, $4
  • ([e|E]?) — символ порядка » e » или » E «, $5
  • ([\+|\-]?) — символ » + » или » — » перед значением порядка, $6
  • (\d*) — цифры порядка, $7

Теперь попробуем подставить этот шаблон в небольшую программку (естественно, убрав из шаблона разрывы строк):

На экране увидим следующее:

Существенно, что параметры $subject , $pattern и $replacement могут быть массивами, в этом случае обработка производится для каждого из их элементов.

Модификатор /e меняет поведение функции preg_replace так, что параметр $replacement после выполнения подстановок интерпретируется как PHP-код и только после этого используется для замены. Если предложенный код некорректен, возникнет ошибка синтаксиса.


У функции есть версия preg_replace_callback , при вызове которой вместо параметра $replacement программист может указать собственную функцию, которой передается массив найденных вхождений.

Итак, круглые скобки позволяют ещё и запоминать подшаблоны для дальнейшего использования в регулярном выражении. Если нам нужно только группировать подшаблоны, но не запоминать их, сэкономить ресурсы компьютера можно с помощью последовательности символов » ?: » (вопросительный знак и двоеточие) после открывающей круглой скобки, которая позволяет скобкам не запоминать:

Здесь первая пара круглых скобок — не запоминающая, так что код

покажет в качестве $1 значения

Четвёртая полезная стандартная функция — preg_split , она разбивает строку по регулярному выражению и возвращает массив, состоящий из подстрок:

Как видно из общей записи, у функции 2 обязательных параметра и 2 необязательных.

Параметр $pattern по-прежнему обозначает регулярное выражение, а $subject — строку, с которой производится работа.

Параметр $limit , если он задан, показывает максимальное число возвращаемых строк. Если количество строк не ограничено, но нужно указать четвёртый параметр ( $flags ), передаётся $limit=-1 .

Параметр $flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘ | ‘):

  • PREG_SPLIT_NO_EMPTY — возвращать только непустые подстроки;
  • PREG_SPLIT_DELIM_CAPTURE — выражение, заключённое в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией;
  • PREG_SPLIT_OFFSET_CAPTURE — для каждой найденной подстроки будет указана её позиция в исходной строке. Этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение.

Функция возвращает массив, состоящий из подстрок строки $subject , которая разбита по границам, соответствующим шаблону $pattern .

Например, для разбиения строки на слова, разделённые пробельными символами (» \r «, » \n «, » \t «, » \f «, » «), достаточно следующего кода:

Для посимвольного разбиения строки можно было поступить ещё проще:

Здесь стандартная функция print_r распечатает массив в удобном для отладки виде:

Жадность и лень

Теперь немного о жадности и лени, да-да, «жадные» и «ленивые» квантификаторы — вполне официальные термины.

Представим, что нам нужно найти в произвольном тексте все теги HTML, заключённые в треугольные скобки. Шаблон тега будет очень простым: » / / «. Проверим, как это работает, на произвольной строке с тегами:

Увы, результатом выдачи оказалась вся исходная строка:

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

Такое поведение называется жадным, в частности, жадность квантификатора » * » и привела к увиденному нами результату.

Помимо жадных, существуют и нежадные или ленивые (lazy) квантификаторы, которые наоборот ищут минимальное, наиболее короткое соответствие.

Чтобы пометить квантификатор как ленивый, обычно достаточно добавить после него знак вопроса:

Как Вы понимаете, добавлять дополнительный вопрос к обычному квантификатору » ? «, обозначающему ноль или один символов, бессмысленно.

С ленивым квантификатором » * » наш шаблон примет вид » / / » и программа благополучно напечатает следующее:

Следует понимать, что использование ленивых квантификаторов вместо жадных может повлечь за собой обратную проблему, в частности, когда выражению соответствует слишком короткая или вообще пустая строка. Иногда имеет смысл вместо «лени» поработать над шаблоном, например, в нашем случае теги можно было найти и обычным жадным квантификатором, применив шаблон » / ]*>/ » (исключили символ » > » из «внутренностей» тега).

Наконец, существует ревнивая или сверхжадная квантификация.

В отличие от обычной (жадной) квантификации, ревнивая квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения.

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

Ставить их можно так:

Позиционные проверки

В синтаксисе регулярных выражений есть возможность описать, что находится до или после того участка строки, который нам нужно найти. Условие совпадения, которое находится перед искомой подстрокой, называют ретроспективной проверкой, условие совпадения, которое идет после подстроки, называется опережающей проверкой. Иначе говоря, ретроспективная проверка совпадает слева, а опережающая — справа.

Чтобы была возможность описать и то, чего не должно быть перед искомой подстрокой или после неё, ретроспективную и опережающую проверки делят ещё на 2 вида каждую:

  • ретроспективная позитивная и ретроспективная негативная проверки;
  • опережающая позитивная и опережающая негативная проверки.

В каждом случае позитивная проверка описывает то, что обязательно должно присутствовать слева (для ретроспективной) или справа (для опережающей) от искомой подстроки.

Негативные проверки, соответственно, описывают то, чего слева или справа от подстроки быть ни в коем случае не должно.

Проверки описываются в круглых скобках следующим образом:

  • Ретроспективная позитивная проверка: (?
  • Ретроспективная негативная проверка: (?
  • Опережающая позитивная проверка: (?=)
  • Опережающая негативная проверка: (?!)

Наверное, нетрудно отследить логику этих обозначений: ретроспективность обозначена знаком » «, словно отсылающим налево от строки, позитивность — знаком » = «, негативность — знаком » ! «, напоминающим об операции «не равно» или отрицания во многих языках программирования.

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

Например, если в тексте часть цифр выделена тегом жирного начертания . , а часть нет, нам же нужно «вытащить» только цифры, выделенные жирным, помочь может вот такой шаблон:

Здесь перед цифрами числа [\d]+ , окруженными произвольным количеством пробельных символов [\s]* , мы требуем наличия открывающей части тега жирного шрифта (? ) и отсутствия его закрывающей части (? ) . Попробуем применить это к какому-нибудь фрагменту разметки HTML:

Лишние пробелы до и после числа 14 помехой не станут, а вот учесть запись вида 14 наш шаблон уже не сможет, и «расширения» ретроспективной позитивной проверки вроде (? [.]*) здесь не помогут, более того, они вызовут синтаксическую ошибку. Дело в том, что позиционные проверки подчиняются ряду ограничений:

  • PCRE не позволяет делать проверки на совпадение текста произвольной длины. То есть, (? — недопустимо. Сделано это для того, чтобы в случае несовпадения поисковый механизм мог вернуться назад на фиксированное количество символов и продолжить поиск совпадений в других позиционных проверках.
  • Совпавшие значения ретроспективных проверок не сохраняются и не доступны через специальные переменные вида $1 , $2 и т.д. Об этом напоминает и знак вопроса после открывающей скобки.
  • Написанные друг за другом проверки применяются независимо друг от друга в одной точке, не меняя её. Совпадение будет найдено, если все проверки совпадут. С точки зрения логики нет никакой разницы в порядке проверок, но рекомендуется ставить первой позиционной проверкой ту, которая имеет наибольшую вероятность несовпадения.

Заключение

Особо хотелось бы предостеречь читателя от искушения использовать «всемогущие» регулярные выражения везде и всюду, ведь, помимо массы достоинств, они имеют и недостатки. Главный из них — заведомо более медленная работа по сравнению со стандартными строковыми функциями или обращениями к элементам массивов. Например, писать поиск по большой таблице базы данных с помощью регулярных выражений я бы не стал — гораздо перспективнее выглядит в этом плане инструкция LIKE из MySQL, позволяющая искать вхождение строки в строковое поле таблицы.

Вообще, если не нужны сложные правила поиска и замены строк, использованию preg_replace следует предпочитать str_replace , preg_split может быть заменена обычной split , а с простыми задачами по поиску и обработке фикированных подстрок вместо preg_match и preg_match_all успешно справляются strpos , strstr , substr , substr_replace и целый ряд других стандартных функций, имеющихся в PHP.

Очередной блог фрилансера

коротко и полезно о веб-разработке

15 регулярных выражений PHP в помощь веб-разработчику

Регулярные выражения – это очень полезный инструмент для разработчиков. С их помощью можно находить, определять или заменять текст, слова или любые другие символы. В сегодняшней статье собраны 15 наиболее полезных регулярных выражений, которые пригодятся любому веб-разработчику.

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

Многим начинающим разработчикам кажется, что регулярные выражения очень сложны для понимания и использования. На самом деле, все не так уж сложно, как может показаться. Прежде чем мы непосредственно перейдем к регулярным выражениям, с их полезным и универсальным кодом, давайте взглянем на основы:

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

Регулярное выражение Означает
foo Строка “foo”
^foo Строка начинается с “foo”
foo$ Строка заканчивается на “foo”
^foo$ «foo» встречается в строке только один раз
[abc] a, b, или c
[a-z] любой символ в нижнем регистре
[^A-Z] любой символ, не находящийся в верхнем регистре
(gif|jpg) Означает как «gif” так и “jpeg”
[a-z]+ Один или более символов нижнего регистра
[0-9.-] Любая цифра, точка или знак минус
^[a-zA-Z0-9_]<1,>$ Любое слово, хотя бы одна буква, число или _
([wx])([yz]) wy, wz, xy, или xz
(^A-Za-z0-9) Любой символ (не число и не буква)
([A-Z]<3>|[0-9]<4>) Означает три буквы или 4 цифры

PHP-функции для регулярных выражений

Функция Описание
preg_match() Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях
preg_match_all() Функция preg_match_all() находит все вхождения строки, заданной по шаблону
preg_replace() Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение.
preg_split() Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска.
preg_grep() Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения.
preg_quote() Экранирует символы регулярного выражения

Проверка доменного имени

Проверяем, является ли строка правильным доменным именем

Подсветка слова в тексте

Это очень полезное регулярное выражение, с его помощью вы можете найти нужное слово и подсветить его. Особенно полезно для отображения результатов поиска.

Подсветка результатов поиска в WordPress блоге

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

Откройте ваш файл search.php, и найдите функцию the_title(). Замените ее следующим кодом:

Теперь, выше этой строки, добавьте этот код:

Сохраните файл search.php, и откройте style.css. Добавьте следующую строку:

Получение всех картинок из HTML-документа

Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL

Удаление повторяющихся слов (не чувствителен к регистру)

Во время печатания, часто повторяются слова? Поможет это регулярное выражение.

Удаление повторяющейся пунктуации

То же самое, только для пунктуации. Попрощайтесь с двойными запятыми.

Поиск XML/HTML тэгов

Эта простая функция, принимает два аргумента. Первый – это тэг, который вам нужно найти, и второй – это переменная, содержащая XML или HTML. Повторюсь, эту функцию очень удобно использовать вместе с cURL.

Поиск XHTML/XML тэгов с определенным значением атрибута

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

Поиск шестнадцатеричных значений цветов

Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.

Поиск заголовка статьи


Этот фрагмент кода найдет и выведет на экран текст, находящийся внутри тэгов , на html-странице.

Парсинг логов Apache

Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?

Замена двойных кавычек “умными” кавычками

Если вы любитель типографики, вам понравится это регулярное выражение, заменяющее обычные двойные кавычки, на “умные кавычки”. Похожее регулярное выражение используется в wordpress в контенте страницы.

Комплексная проверка пароля

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

Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.

WordPress: Использование регулярного выражения для получения картинок из записи

Поскольку многие из вас являются пользователями WordPress, вам возможно пригодится код, который позволяет получить все картинки, из текста статьи, и вывести их.

Для того, чтобы использовать этот код, просто вставьте его в любой файл вашей темы.

Генерация автоматических смайлов

Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.

Перевод статьи “15 PHP regular expressions for web developers”, автор Jean-Baptiste Jung

Рассказать друзьям

Понравилась статья? Лучший способ сказать спасибо — поделиться ссылкой в социальных сетях:

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

Что такое регулярные выражения?

PHP regexp — это мощный алгоритм сопоставления шаблонов, которое может быть выполнено в одном выражении. Регулярные выражения PHP используют арифметические операторы ( такие как +, -, ^ ) для создания сложных выражений.

Для чего используются регулярные выражения:

  • Регулярные выражения упрощают идентификацию строковых данных путем вызова одной функции. Это экономит время при составлении кода;
  • При проверке введенных пользователем данных, таких как адрес электронной почты, домен сайта, номер телефона, IP-адрес ;
  • Выделение ключевых слов в результатах поиска;
  • Регулярные выражения могут использоваться для идентификации тегов и их замены.

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

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

  • preg_match — используется для выполнения сопоставления с шаблоном строки. Она возвращает true , если совпадение найдено, и false , если совпадение не найдено;
  • preg_split — используется для разбивки строки по шаблону, результат возвращается в виде числового массива;
  • preg_replace – используется для поиска по шаблону и замены на указанную строку.

Ниже приведен синтаксис функций регулярных выражений, таких как preg_match , preg_split или PHP regexp replace :

«имя_функции» — это либо preg_match , либо preg_split , либо preg_replace .
«/…/» — косые черты обозначают начало и конец регулярного выражения.
«‘/шаблон/’» — шаблон, который нам нужно сопоставить.
«объект» — строка, с которой нужно сопоставлять шаблон.

Теперь рассмотрим практические примеры использования упомянутых выше функций.

Preg_match

В первом примере функция preg_match используется для выполнения простого сопоставления шаблоном для слова guru в заданном URL-адресе .

В приведенном ниже коде показан вариант реализации данного примера:

Рассмотрим ту часть кода, которая отвечает за вывод «preg_match (‘/ guru /’, $ my_url)» .

«preg_match(…)» — функция PHP match regexp .
«‘/Guru/’» — шаблон регулярного выражения.
«$My_url» — переменная, содержащая текст, с которым нужно сопоставить шаблон.

Preg_split

Рассмотрим другой пример, в котором используется функция preg_split .

Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:

Preg_replace

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

Приведенный ниже код ищет в строке слово guru . Он заменяет его кодом css , который задает цвет фона:

Метасимволы

В приведенных выше примерах использовались простые шаблоны. Метасимволы позволяют выполнять более сложные сопоставления шаблонов PHP regexp , такие как проверка адреса электронной почты. Рассмотрим часто используемые метасимволы.

Метасимвол Описание Пример
. Обозначает любой единичный символ, кроме символа новой строки. /./ — все, что содержит один символ.
^ Обозначает начало строки, не включая символ /. /^PH/ — любая строка, которая начинается с PH.
$ Обозначает шаблон в конце строки. /com$/ — guru99.com,yahoo.com и т.д.
* Обозначает любое количество символов, ноль или больше. /com*/ — computer, communication и т.д.
+ Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. /yah+oo/ — yahoo.
Символ экранирования. /yahoo+.com/ — воспринимает точку, как дословное значение.
[…] Класс символов. /[abc]/ — abc.
a-z Обозначает строчные буквы. /a-z/ — cool, happy и т.д.
A-Z Обозначает заглавные буквы. /A-Z/ — WHAT, HOW, WHY и т.д.
0-9 Обозначает любые цифры от 0 до 9. /0-4/ — 0,1,2,3,4.

Теперь рассмотрим сложный PHP regexp пример, в котором проверяется валидность адреса электронной почты:

Результат: адрес электронной почты name@company.com является валидным.

Пояснение шаблона «[/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+.[a-zA-Z.]<2,5>$/] «

«‘/…/’» начинает и завершает регулярное выражение.
«^[a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@[a-zA-Z0-9-]» соответствует символу @ , за которым следуют буквы в нижнем или верхнем регистре, цифры от 0 до 9 или дефисы.
«+.[a-zA-Z.]<2,5>$/» указывает точку, используя обратную косую черту, затем должны следовать любые буквы в нижнем или верхнем регистре, количество символов в конце строки должно быть от 2 до 5.

Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.

Заключение

  • PHP regexp — это алгоритм поиска по шаблону;
  • Регулярные выражения полезны при выполнении проверок валидности, создании HTML-шаблонов , которые распознают теги и т. д.;
  • PHP имеет встроенные функции для работы с регулярными выражениями: preg_match , preg_split и preg_replace ;
  • Метасимволы позволяют создавать сложные шаблоны.

Данная публикация представляет собой перевод статьи « PHP Regular Expressions » , подготовленной дружной командой проекта Интернет-технологии.ру

Лекции по веб-программированию

Регулярные выражения — мощный гибкий инструмент для синтаксического анализа текста в соответствии с определенным шаблоном.

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

Основа регулярного выражения — шаблон. С его помощью описывается формат нужного фрагмента текста.

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

Пример самого простого регулярного выражения:

‘/веб-программирование/’ — соответствует строке, в которой есть слово ‘веб-программирование’.

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

Метасимволы \ ^ $ . | ? * + [ ] ( )

\ — символ экранирования.
Пример: ‘/4\/2=2/’ — соответствует строке ‘4/2=2’. Символ ‘/’, используемый как ограничитель шаблона, был экранирован, после чего он перестал выполнять в данном месте свое специальное значение, а стал означать операцию деления внутри текста строки.

^ — символ начала данных.
$ — символ конца данных.
Пример: ‘/^веб-программирование$/’ — соответствует строке, точно совпадающей со словом ‘веб-программирование’. Т.е. с буквы ‘в’ строка начинается и после ‘е’ заканчивается.

. — любой символ, кроме перевода строки. Но есть модификатор, при использовании которого перевод строки тоже относится к «любым» символам.
Пример: ‘/веб.программирование/’ — соответствует строке, содержащей ‘веб-программирование’, или ‘веб.программирование’, или ‘вебoпрограммирование’ и т.д.

[] — квадратные скобки определяют символьный класс, т.е. набор символов, с которыми проверяется совпадение. Символы могут быть перечислены по отдельности, или в виде некоторого диапазона символов, обозначенного первым и последним символом, разделенных знаком ‘-‘, а также с помощью специальных символов. (см.ниже).
Пример: ‘/б[иао]м/’ — под соответствие попадут только строки, содержащие ‘бим’, ‘бам’ или ‘бом’.

() — круглые скобки используются для определения области действия и приоритета операций. Фактически выделяют группу в шаблоне, так называемую подмаску или подшаблон.
| — перечисление, логическое ‘или’.
Пример: ‘/gray|grey/’ или ‘/gr(a|e)y/’ описывают строку ‘gray’ или ‘grey’.

Квантификаторы — ставятся после символа, символьного класса или группы и определяют, сколько раз предшествующее выражение может встречаться.
? — одно или ноль вхождений.
* — любое количество вхождений, в том числе и ноль.
+ — одно или более вхождений.
Пример: выражение ‘/(б[иао]м-?)*/’ соответствует последовательности вида ‘бим-бамбом-бам-бамбим-бом’ или пустой строке. Выражение ‘/(б[иао]м-?)+/’ соответствует строке, в которой обязательно должно быть хоть одно слово ‘бим’, ‘бам’ или ‘бом’.

<> — квантификатор, определяющий точное указанное число вхождений символа, символьного класса или группы.

Представление Число повторений Пример Соответствие
<n> Ровно n раз colou<3>r colouuur
<m,n> От m до n включительно colou<2,4>r colouur , colouuur , colouuuur
m,> Не менее m colou<2,>r colouur , colouuur , colouuuur и т. д.
<,n> Не более n colou<,3>r color , colour , colouur , colouuur

Символьные классы
Набор символов в квадратных скобках ‘[ ]’ именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов. В частности, ‘[абв]’ задаёт возможность появления в тексте одного из трёх указанных символов, а ‘[1234567890]’ задаёт соответствие одной из цифр. Возможно указание диапазонов символов: например, ‘[А-Яа-я]’ соответствует всем буквам русского алфавита, за исключением букв ‘Ё’ и ‘ё’.

Если требуется указать символы, которые не входят в указанный набор, то используют символ ‘^’ внутри квадратных скобок, например ‘[^0-9]’ означает любой символ, кроме цифр.

\cx — ctrl + x. На месте x может быть любой символ.
\e — escape.
\f — разрыв страницы.
\n — перевод строки.
\r — возврат каретки.
\t — табуляция.
\b — граница слова.
\B — не граница слова.

\d — цифровой символ.
\D — нецифровой символ.
\s — пробельный симол: пробел, перевод строки, табулятор.
\S — непробельный символ.
\w — Буквенный или цифровой символ или знак подчёркивания.
\W — Любой символ, кроме буквенного или цифрового символа или знака подчёркивания.

Две последние конструкции не соответствуют никаким реальным символам.
\xHH — символ с шестнадцатеричным кодом HH. x — это именно буква икс.
\DDD — символ с восьмеричным кодом DDD. Или ссылка на подгруппу (подмаску).

Важно, что метасимволы не активны внутри классов. Например, ‘[akm$]’ будет соответствовать любому из символов ‘a’, ‘k’, ‘m’ или ‘$’. Знак ‘$’ является метасимволом (как видно из списка выше), но внутри класса он лишается своей особой природы.

Жадные (greedy) повторения

По умолчанию все квантификаторы, обозначающие повторения символов (группы символов), работают по жадному алгоритму: движок будет пытаться повторить его столько раз, сколько это возможно. Если следующие части шаблона не соответствуют, движок вернется назад и попытается попробовать снова с несколькими повторами символа.


Рассмотрим как это работает на примере.

Пусть дано регулярное выражение ‘/a[bcd]*b/’ . Оно соответствует букве ‘a’, нулю или более символов из класса ‘[bcd]’ , и наконец, заключительной букве ‘b’. Теперь представим себе сопоставление этого регулярного выражения строке ‘abcbd’. Вот как происходит сравнение поэтапно:

1. a — ‘a’ соответствует регулярному выражению;
2. abcbd — движок сопоставляет ‘[bcd]*’ на как можно большем числе символов, то есть до конца строки (поскольку все символы соответствуют классу в скобках ‘[]’);
3. Неудача — движок пытается сопоставить последний символ в регулярном выражении — букву ‘b’, но текущая позиция уже в конце строки, где нет никаких символов, так что он терпит неудачу;
4. abcb — вернулись назад, уменьшили на один символ сопоставление с ‘[bcd]*’ ;
5. Неудача — пытаемся снова найти ‘b’, но в конце только ‘d’;
6. abc — снова возвращаемся назад, теперь ‘[bcd]*’ это только ‘bc’;
7. abcb — снова ищем последний символ регулярного выражения — ‘b’. Теперь он действительно находится на нужной позиции и мы добиваемся успеха.

Итак, был достигнут конец регулярного выражения и сопоставление с ним дало ‘abcb’. Этот пример показал, как движок сначала забирается так далеко, как может, и, если не находит соответствия, возвращается назад, снова и снова работая с остатком регулярного выражения. Он будет делать так до тех пор, пока не получит ноль совпадений для ‘[bcd]*’, и, если и тогда не получится совпадения, то заключит, что строка совсем не соответствует шаблону.

Такой подход может оказаться значительной проблемой. Например, часто ожидают, что выражение ‘/ /’ найдёт в тексте теги HTML. Однако, если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.

Эту проблему можно решить несколькими способами:

— Учитывать символы, не соответствующие желаемому образцу ‘/ ]*>/’ .
— Определить квантификатор как нежадный (ленивый, англ. lazy) — добавив после него знак вопроса ‘/ /’ .
— Отключить жадность для всего шаблона, используя модификатор ‘/ /U’ (см. ниже).

Модификаторы

Модификаторы вносят новые правила в обработку регулярного выражения и действуют с момента вхождения и до конца регулярного выражения или противоположного модификатора. Указываются они либо в скобках, например так: ‘(?Ui)’ , либо после закрывающего символа ограничителя шаблона ‘/pattern/Ui’ .

i — регистронезависимость.
U — инвертирует жадность.
m — многострочный поиск, т.е. символы ‘^’, ‘$’ означают начало и конец всего текста.
s — символ ‘.’ включает в себя и перевод строки.
x — заставляет игнорировать все неэкранированные пробельные символы, если они не перечислены в символьном классе. Удобно, когда переводом строк и пробелами необходимо навести удобочитаемость.

При использовании модификаторов, можно использовать знак ‘-‘ для отключения модификатора.
Пример ‘(?m-i)’ — включает многострочный поиск и отключает регистронезависимый.

Здесь надо сказать, что все модификаторы что-то включают. Или отключают, если указаны с минусом. А вот ‘U’ инвертирует. Т.е. если была жадность включена, он выключит без всяких минусов.

Утверждения

Утверждения — это проверки символов, идущих до или после текущей позиции сопоставления. Утверждения касательно последующего текста начинаются с ‘(?=’ для положительных утверждений и с ‘(?!’ для отрицающих утверждений.

Утверждения касательно предшествующего текста начинаются с ‘(? для положительных утверждений и ‘(? для отрицающих.

Пример: регулярное выражение ‘/(? соответствует любому слову ‘программирование’, кроме ‘веб-программирование’.

Комментарии

Комментарии начинаются с ‘(?#’ и продолжаются до ближайшей закрывающей скобки.

Функции PHP для работы с регулярными выражениями

preg_match_all

preg_match_all — выполняет глобальный поиск совпадения регулярного выражения.

Синтаксис: int preg_match_all (string pattern, string subject, array matches [, int flags])

Ищет в subject все совпадения с регулярным выражением pattern и помещает их в matches в порядке, специфицированном в order.

После нахождения первого совпадения последующий поиск продолжается до нахождения последнего совпадения.
flags может принимать следующие значения:

PREG_PATTERN_ORDER (по умолчанию)
Упорядочивает результаты таким образом, что $matches[0] это массив полных совпадений с шаблоном, $matches[1] это массив строк, совпавших с первой подмаской в скобках, и так далее.

Этот пример выдаст:

Итак, $out[0] содержит массив строк, совпавших со всем шаблоном, а $out[1] содержит массив строк, заключённых в тэги.

PREG_SET_ORDER

Упорядочивает результаты таким образом, что $matches[0] это массив первого набора совпадений, $matches[1] это массив второго набора совпадений, и так далее.

Этот пример выдаст:

В данном случае $matches[0] это первый набор совпадений, а $matches[0][0] содержит текст, совпавший с полным шаблоном, $matches[0][1] содержит текст, совпавший с первой подмаской, и так далее. Аналогично $matches[1] это второй набор совпадений и т.д.

Если никакой флаг упорядочивания не задан, принимается PREG_PATTERN_ORDER.

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

В php используется два языка для написания регулярных выражений PCRE и POSIX.

\d == [0-9] — любые символы от 0 до 9

\D != [^0-9] — любые символы кроме 0-9

\w == [0-9A-Za-z] — алфовитно — цифровые символы

\W != [^0-9A-Za-a] — любой символ кроме символа слово.

\s == [ \t\n\r] — символы пробел, символ табуляции, новой строки или возврата каретк.

\S != [^ \tn\r] — любые символы кроме пробела, символ табуляции, новой строки или возврата каретки

| — или

? — s?he — выдаст результат he или she тоесть буква перед знаком вопроса не является обязательной. Чтобы сделать последовательность символов (или метасимволов) необязательной, их можно сгрупировать в скобках: с помощью регулярного выражения (wo)?man можно искачть слова «man» или «woman».

+ — любое количество символов, к примеру dim+a будет dimaaaa или dimmma

* — любое воличество символов или вообше отсутствие символа К примеру dim*a Выдаст dima, dia, dimmma, dimaaaa но не dim или di

^ — начало строки

$ — конец строки

i — данный модификатор позволяет не учитывать регистр букв.

s — данный модификатор показывает что мы работаем в однострочном режиме. В могострочном режиме точка совпадает со всеми символами кроме \n чтобы добится нужной функциональности указывается однострочный режим.

x — дан модификатор заставляет анализатор PCE игнорировать пробельные символы в выражениях (за исключением явно указанных как \s или в квадратных скобках) это позволяет записывать выражения более красиво.

Ограничители

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

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

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

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

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

ereg — необходим для проверки введенных данных.

Как научить регулярное выражение, чтобы preg_match_all искала строки где нет подмаски?

Например, есть регулярное выражение

Как сделать такое выражение, чтобы preg_match_all выдало все строки где нет ссылок?

UPD Проблема в том, что я не могу ничего использовать кроме регулярного выражения, скрипт обфусцирован. Внедрить свою логику не получится.

Miraage, Я не уверен, так как не вижу логики, но ищет оно по строкам по файлу. То есть вполне возможно, что там он рыскает по файлу и каждую строку чекает preg_match.

Пример регулярных выражений: поиск ссылок HREF Regular Expression Example: Scanning for HREFs

В следующем примере показаны поиск и вывод всех значений href=». «, а также их позиций в строке. The following example searches an input string and displays all the href=»…» values and their locations in the string.

Объект Regex The Regex Object

Поскольку метод DumpHRefs может быть вызван из пользовательского кода несколько раз, он использует метод static ( Shared в Visual Basic) Regex.Match(String, String, RegexOptions). Because the DumpHRefs method can be called multiple times from user code, it uses the static ( Shared in Visual Basic) Regex.Match(String, String, RegexOptions) method. Это позволяет обработчику регулярных выражений кэшировать регулярное выражение и избежать дополнительной нагрузки, связанной с созданием объекта Regex при каждом вызове метода. This enables the regular expression engine to cache the regular expression and avoids the overhead of instantiating a new Regex object each time the method is called. Затем объект Match выполняет итерацию по всем совпадениям в строке. A Match object is then used to iterate through all matches in the string.

В следующем примере показан вызов метода DumpHRefs . The following example then illustrates a call to the DumpHRefs method.

Возможные интерпретации шаблона регулярного выражения href\s*=\s*(?:[«‘](? [^»‘]*)[«‘]|(? \S+)) показаны в следующей таблице. The regular expression pattern href\s*=\s*(?:[«‘](? [^»‘]*)[«‘]|(? \S+)) is interpreted as shown in the following table.

Шаблон Pattern ОПИСАНИЕ Description
href Совпадение с литеральной строкой «href». Match the literal string «href». Сопоставление не учитывает регистр. The match is case-insensitive.
\s* Соответствует нулю или нескольким символам пробела. Match zero or more white-space characters.
= Соответствует знаку равенства. Match the equals sign.
\s* Соответствует нулю или нескольким символам пробела. Match zero or more white-space characters.
(?:\[«‘\](? \[^»‘\]*)[«‘]|(? \S+)) Соответствует одному из следующих символов, не назначая результат группе записи. Match one of the following without assigning the result to a captured group:

Кавычки или апостроф, за которыми следует ноль или несколько любых символов, кроме кавычек или апострофа, за которыми следуют кавычки или апостроф. A quotation mark or apostrophe, followed by zero or more occurrences of any character other than a quotation mark or apostrophe, followed by a quotation mark or apostrophe. В этот шаблон включена группа с именем 1 . The group named 1 is included in this pattern.

Один или более символов, которые не являются пробелами. One or more non-white-space characters. В этот шаблон включена группа с именем 1 . The group named 1 is included in this pattern.

(? [^»‘]*) Присвоить ноль или несколько любых символов, кроме кавычки или апострофа, группе записи 1 . Assign zero or more occurrences of any character other than a quotation mark or apostrophe to the capturing group named 1 .
(? \S+) Присвоить один или несколько символов, отличных от пробела, захваченной группе с именем 1 . Assign one or more non-white-space characters to the capturing group named 1 .

Класс результата поиска Match Result Class

Результаты поиска сохраняются в классе Match, который предоставляет доступ ко всем подстрокам, извлеченным в ходе поиска. The results of a search are stored in the Match class, which provides access to all the substrings extracted by the search. Также он запоминает искомую строку и использованное регулярное выражение, что позволяет вызвать метод Match.NextMatch для продолжения поиска с того места, где закончился предыдущий. It also remembers the string being searched and the regular expression being used, so it can call the Match.NextMatch method to perform another search starting where the last one ended.

Явно именованные шаблоны Explicitly Named Captures

В обычных регулярных выражениях круглые скобки, обозначающие отдельные шаблоны, автоматически последовательно нумеруются. In traditional regular expressions, capturing parentheses are automatically numbered sequentially. В связи с этим возникают две проблемы. This leads to two problems. Во-первых, если регулярное выражение изменяется из-за вставки или удаления пары круглых скобок, все части кода, которые ссылаются на нумерованные шаблоны, необходимо переписать, чтобы отразить новую нумерацию. First, if a regular expression is modified by inserting or removing a set of parentheses, all code that refers to the numbered captures must be rewritten to reflect the new numbering. Во-вторых, вследствие того, что различные пары круглых скобок часто используются для определения двух альтернативных выражений для поиска, трудно определить, какое из двух выражений в действительности вернуло результат. Second, because different sets of parentheses often are used to provide two alternative expressions for an acceptable match, it might be difficult to determine which of the two expressions actually returned a result.

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


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


| — означает логическое «или».

#а|о# — шаблон ищет 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() для ее активации.

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

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

Теперь разберем подробно все эти функции. Естественно, с примерами.
Функция preg_match()

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

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

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

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

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

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

10 регулярных выражений для web-разработчиков

Регулярные выражения, очень полезная штука для разработчиков. С помощью них можно найти одинаковые слова в тексте, проверить введенные данные и еще много полезных вещей. В этом посте я собрал 10 регулярных выражений, которые должны быть под рукой у любого web-разработчика.

Регулярное выражение Значение
foo Строка «foo»
^foo «foo» в начале строки
foo$ «foo» в конце строки
^foo$ В строке содержится только одно слово»foo»
[abc] a, b, или c
[a-z] Все буквы в нижнем регистре
[^A-Z] Любой символ, который не является буквой в верхнем регистре
[0-9.-] Любая цифра, точка или дефис
^[a-zA-Z0-9_]<1,>$ Любое слово содержащее 1 букву, цифру или _

PHP функции для работы с регулярными выражениями

Функция Описание
preg_match() Функция preg_match() ищет в заданном тексте совпадения с шаблоном, если совпадене есть возвращает true, если нет то false
preg_match_all() Функция выполняет поиск шаблона в статье
preg_replace() Функция preg_replace() выполняет поиск и замену по регулярному выражению
preg_split() Функция preg_split() разбивает строку по регулярному выражению
preg_grep() Функция preg_grep() возвращает массив, состоящий из элементов входящего массива , которые соответствуют заданному шаблону
preg_ quote() Функция preg_ quote() принимает строку и добавляет обратный слеш перед каждым служебным символом. Проще говоря, она экранирует символы

Валидация имени домена
Проверяем имя домена.

Выделение определенного слова в тексте
Это регулярное выражение можно использовать, например, для того чтобы выделить найденые слов при поиске.

Удаление повторяющихся слов
Написали пару одинаковых слов? Не проблема, с помощью этого регулярного выражения вы сможете их легко удалить.

Удаление повторяющихся знаков препинания
Почти тоже самое, что и регулярное выражение выше, только будут удаляться знаки препинания.

Автоматическая генерация смайликов
Замена смайликов на картинки.

Проверка логина
Логин может состоять из букв, цифр, дефисов и подчёркиваний. Длина от 3 до 16 символов.

Проверка email
Email должен быть такого вида: логин@поддомен.домен.


Проверяем шестнадцатиричный цвет
Цвет может быть задан и без «#»;

Получаем title страницы
С помощью этого регулярного выражения, можно вытащить title страницы.

Проверка времени
Время должно быть задано в таком виде: mm:hh.

Поиск сайта в строке — Регулярные выражения — Модификаторы шаблонов g и i — Диапазоны [abc] и [123] – Кванторы и ?

Урок №9 Поиск сайта в строке

Количество просмотров : 742

Этот урок посвящен созданию регулярного выражения для поиска имени сайта в строке. Здесь Вы узнаете что-то новое о составлении регулярных выражений и закрепите материал из предыдущих уроков.

Допустим, есть переменная, содержащая несколько названий сайтов .

var site = «У меня есть 5 сайтов:
www.mysite.ru ,
www.mysite.com ,
http://my-site.ru ,
https://my-site-2pc.ru и
Mysite.RU
Мне нужны только те, что в зоне .ru» ;

Нужно написать регулярное выражение, которое из этого списка сайтов сможет выбрать лишь те, которые находятся в зоне ru.

Нужны полные названия сайтов.

Поиск сайта в строке — Точка в регулярных выражениях экранируется

Следует начать решение текущей задачи с того, чтобы составить регулярное выражение для зоны .ru

Здесь стоит сказать о том, что точка . в регулярных выражениях обозначает любой символ ,
кроме переноса строки (см. шпаргалку по регулярным выражениям), поэтому в нашем случае она экранируется при помощи обратного слэша. См. пример ниже.

var index = «У меня есть 5 сайтов: www.mysite .ru , www.mysite.com, http://my-site .ru , https://my-site-2pc .ru и Mysite .RU . Мне нужны только те, что в зоне .ru » ;
var regular = / \.ru / g; /* Экранируем точку + добавляем глобальный поиск g */
var result = index . match ( regular ); /* Ищем в строке все зоны .ru */

for( i = 0 ; i result . length ; i ++ ) /* Выводим элементы массива result на экран при помощи цикла for */
<
document. write ( result [ i ] + «

Итак, пока что найдены и выведены на экран все зоны .ru кроме .RU . Кроме этого последняя из них не относится к названию сайта (она расположена в конце строки). Далее.

Поиск сайта в строке — Регистронезависимый шаблон i

Чтобы вывести недостающую зону .RU , снова обратимся к шпаргалке по регулярным выражениям — к группе «Модификаторы шаблонов» . И воспользуемся регистронезависимым шаблоном i , благодаря которому игнорируется индекс .

Теперь, при помощи регистронезависимого шаблона i найдены и выведены на экран все зоны .ru в том числе .RU .

Поиск сайта в строке — Диапазон [abc] (a или b или c)

Чтобы двигаться дальше в составлении регулярного выражения для поиска сайтов в строке, следует задать вопрос: что может быть перед зоной .ru?

Чтобы на него ответить, нужно знать , что в составе доменного имени могут быть только латинские буквы, цифры или дефис .

Имена доменов на кириллице сейчас учитываться не будут.

Итак, сейчас есть утверждение , что перед зоной .ru может быть любая буква латинского алфавита, любая цифра от 0 до 9 или дефис.

Снова обратимся к шпаргалке по регулярным выражениям — к группе «Диапазоны» .

  • В первую очередь нас интересует диапазон [abc] (a или b или c). А в нашем случае [a-z] , то есть любая латинская буква.
  • Указывая на цифру в имени сайта можно воспользоваться уже знакомым регулярным выражением\d , которое обозначает любую цифру.

Либо дополнительно к диапазону латинских букв, добавить диапазон цифр от 0 до 9. То есть в итоге указать диапазон [a-z0-9] .

  • И, наконец, в общий диапазон латинских букв и цифр можно добавить дефис
    [a-z0-9-] .
  • Вернемся к нашему примеру и дополним регулярное выражение.

    В результате помимо зоны .ruна экран выведен лишь первый символ , который стоит перед ней и который попадает в диапазон [a-z0-9-] . Как вывести остальные?

    Поиск сайта в строке — Квантор (n или больше)

    Итак, как дополнить регулярное выражение
    [a-z0-9-]\.ru , чтобы при поиске сайта в строке вывести на экран все символы из диапазона [a-z0-9-] , расположенные перед зоной .ru?

    Зная о том, что в имени домена, перед зоной .ru должно быть хотя бы 2 символа , воспользуемся квантором <2,>, который означает «2 или больше» .

    Может иметь место такой квантор — с двумя параметрами , например, <2,100>. В этом случае он будет учитывать диапазон от 2 до 100 символов.

    Возвращаемся к предыдущему примеру и дополняем в нем регулярное выражение.

    В результате мы увидим названия сайтов, то есть все символы, которые расположены перед зоной .ru были учтены, за исключением протоколов http:// и https:// , а также не хватает www и точки после www . Идем далее.

    Поиск сайта в строке — Ищем www. и http:// — Квантор ? — 0 или 1

    В первую очередь следует добавить в регулярное выражение поиск www и точки после этих трех букв.

    Казалось бы здесь все просто. Зная о том, что точка в регулярных выражениях экранируется, нужно всего лишь к общему выражению добавить следующую запись: www\.

    В результате мы видим лишь сайт с www. , так как регулярное выражение www\.[a-z0-9-]<2,>\.ru подразумевает, что www. является обязательным элементом шаблона, по которому осуществляется поиск.

    Но как видно из исходной переменной index — www. вовсе не являются обязательными символами в доменном имени сайта. И, кроме этого, они не должны повторяться более одного раза. Учитывая это, выражение www\. следует дополнить.

    Для этого снова обратимся к шпаргалке по регулярным выражениям, откуда на этот раз возьмем квантор ? , который означает «0 или 1» . В нашем случае 0 будет говорить о том, что www. не является обязательным элементом шаблона (т.е. этих символов может и не быть), а 1 — что если www. и встречается в доменном имени сайта, то лишь один раз.

    В итоге мы получим следующее: (www\.)? .

    То же самое относится и к протоколам http:// и https:// — к ним также следует применить квантор ? . Не забываем экранировать слэши .

    Записи для протоколов будут такими: (http:\/\/)? и (https:\/\/)? . Смотрим пример ниже.

    И в последнем примере, который будет рассмотрен в рамках этого урока, будет сокращено общее регулярное выражение за счет использования для обоих протоколов http:// и https:// одной записи:

    Вместо (http:\/\/)? и (https:\/\/)? запись будет следующей: (https?:\/\/)?

    Отдельно для буквы s действует квантор ? . Смотрим пример.

    Итак, в этом уроке было составлено достаточно длинное регулярное выражение для поиска сайтов в строке.

    На первый взгляд оно может казаться довольно сложным, но если его разобрать пошагово, то, наоборот, все достаточно просто.

    Давайте еще раз коротко его опишем:

      (https?:\/\/)? — это часть шаблона ищет в строке http:// или https:// . Первый квантор ? применим к букве s , второй квантор ? говорит о том, что протокола http:// или https:// может и не быть, а если он есть, то встречается один раз.

    Оба слэша здесь экранируются обратным слэшем.
    (www\.)? — эта часть шаблона ищет в строке www. И снова используется квантор ?

    При этом точка экранируется обратным слэшем.
    [a-z0-9-] <2,>— здесь осуществляется поиск диапазона из латинских букв, цифр, среди которых может быть и дефис [a-z0-9-] . А запись <2,>говорит о том, что этих символов должно быть как минимум два или больше.

    В имени сайта может встретиться и под домен. Например, вот так: www.subdomain.mysite.ru . Тогда к диапазону [a-z0-9-] нужно будет добавить точку, при этом не забываем ее экранировать. Вот так: [a-z0-9-\.] .

  • \.ru — наконец, мы ищем зону .ru и экранируем точку.
  • Домашнее задание — Поиск сайта в строке — Поиск кредитной карты

    Здесь было рассмотрено достаточно тонкостей и нюансов при составлении регулярного выражения для поиска сайтов в строке .

    Теперь нужно выполнить домашнее задание.

    Вам нужно написать регулярное выражение для поиска в тексте номера кредитной карты. Текст: «Иван вчера потерял свою кредитку, ее номер 1178-9087-2384-8787. Поэтому он пошел в банк и описал ситуацию. Там пошли ему навстречу и выдали новую кредитку под номером: 1103-8899-0811-1722» .

    Напомню, что кредитные карты имеют формат: xxxx-xxxx-xxxx-xxxx . Например: 1178-9087-2384-8787

    При этом, вам нужно найти только те номера, в которых первые 4 цифры содержат только 0 , или 1 или 2 , или 3 , т.е. вас, например, устроит номер 1103-8899-0811-1722 , но не устроит 1490-8877-7345-8111 (т.к. здесь присутствует цифры 4 и 9 , не удовлетворяющие нашим условиям).

    При этом номер кредитки нужно не просто найти, а вытащить в переменную result и вывести на экран.

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

    Ниже будут приведены два решения.

    Пояснения к решению №1:

    • Номер кредитной карты состоит из 19-ти символов xxxx-xxxx-xxxx-xxxx .
    • Переменная regular_all содержит регулярное выражение [0-9-] <19>для поиска номера кредитной карты, состоящего из любых цифр от 0 до 9.

    Диапазон [0-9-] — цифры от 0 до 9 и дефис в количестве <19>символов.

  • Добавляем к регулярному выражению глобальный поиск g для поиска всех номеров кредитных карт в строке .
  • Переменная regular_select содержит регулярное выражение [0-3]<4>[0-9-] <15>для поиска номера кредитной карты, первые четыре символа , которого состоят из цифр от 0 до 3.
  • Пояснения к решению №2:

    • Номер кредитной карты имеет формат xxxx-xxxx-xxxx-xxxx . То есть это 4 последовательности из 4-ч цифр, разделенных дефисом
    • Переменная regular_all содержит регулярное выражение:

    \d<4>-\d<4>-\d<4>-\d <4>для поиска номера кредитной карты, состоящего из любых цифр от 0 до 9.

    Любая цифра от 0 до 9 \d и квантор <4>(что значит ровно 4) образуют шаблон, который обозначает последовательность из любых 4-х цифр от 0 до 9 \d <4>.

    Таких шаблонов всего 4, разделенных дефисом.
    Переменная regular_select содержит регулярное выражение:

    [0123]<4>-\d<4>-\d<4>-\d <4>для поиска номера кредитной карты, первые четыре символа , которого состоят из цифр от 0 до 3.

    [0123] <4>— Диапазон [0123] из цифр от 0 до 3 в количестве <4>символов.

    Илон Маск рекомендует:  Delphi 6 скриншоты
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL